Flask從入門到精通之重定向和使用者會話

2022-03-28 03:38:43 字數 1968 閱讀 8896

最新版的hello.py 存在乙個可用性問題。使用者輸入名字後提交表單,然後點選瀏覽器的重新整理按鈕,會看到乙個莫名其妙的警告,要求在再次提交表單之前進行確認。之所以出現這種情況,是因為重新整理頁面時瀏覽器會重新傳送之前已經傳送過的最後乙個請求。如果這個

請求是乙個包含表單資料的post 請求,重新整理頁面後會再次提交表單。大多數情況下,這並不是理想的處理方式。

很多使用者都不理解瀏覽器發出的這個警告。基於這個原因,最好別讓web 程式把post 請求作為瀏覽器傳送的最後乙個請求。

這種需求的實現方式是,使用重定向作為post 請求的響應,而不是使用常規響應。重定向是一種特殊的響應,響應內容是url,而不是包含html **的字串。瀏覽器收到這種響應時,會向重定向的url 發起get 請求,顯示頁面的內容。這個頁面的載入可能要多花幾微秒,因為要先把第二個請求發給伺服器。除此之外,使用者不會察覺到有什麼不同。現在,最後乙個請求是get 請求,所以重新整理命令能像預期的那樣正常使用了。這個技巧稱為post/ 重定向/get 模式。

但這種方法會帶來另乙個問題。程式處理post 請求時,使用form.name.data 獲取使用者輸入的名字,可是一旦這個請求結束,資料也就丟失了。因為這個post 請求使用重定向處理,所以程式需要儲存輸入的名字,這樣重定向後的請求才能獲得並使用這個名字,從而構建真正的響應。

程式可以把資料儲存在使用者會話中,在請求之間「記住」資料。使用者會話是一種私有儲存,存在於每個連線到伺服器的客戶端中。它是請求上下文中的變數,名為session,像標準的python 字典一樣操作。

預設情況下,使用者會話儲存在客戶端cookie 中,使用設定的secret_key 進行加密簽名。如果篡改了cookie 中的內容,簽名就會失效,會話也會隨之失效。

下面的例子是index() 檢視函式的新版本,實現了重定向和使用者會話。

from

flask import flask, render_template, session, redirect, url_for'/

', methods=['

get', '

post'])

def index():

form =nameform()

ifform.validate_on_submit():

session[

'name

'] =form.name.data

return redirect(url_for('

index'))

return render_template('

index.html

', form=form, name=session.get('

name

'))

在程式的前乙個版本中,區域性變數name 被用於儲存使用者在表單中輸入的名字。這個變數現在儲存在使用者會話中,即session['name'],所以在兩次請求之間也能記住輸入的值。

現在,包含合法表單資料的請求最後會呼叫redirect() 函式。redirect() 是個輔助函式,用來生成http 重定向響應。redirect() 函式的引數是重定向的url,這裡使用的重定向url 是程式的根位址,因此重定向響應本可以寫得更簡單一些,寫成redirect('/'),但卻會使用flask 提供的url 生成函式url_for()。推薦使用url_for() 生成url,因為這個函式使用url 對映生成url,從而保證url 和定義的路由相容,而且修改路由名字後依然可用。

url_for() 函式的第乙個且唯一必須指定的引數是端點名,即路由的內部名字。預設情況下,路由的端點是相應檢視函式的名字。在這個示例中,處理根位址的檢視函式是index(),因此傳給url_for() 函式的名字是index。

最後一處改動位於render_function() 函式中,使用session.get('name') 直接從會話中讀取name 引數的值。和普通的字典一樣,這裡使用get() 獲取字典中鍵對應的值以避免未找到鍵的異常情況,因為對於不存在的鍵,get() 會返回預設值none。使用這個版本的程式時,重新整理瀏覽器頁面,你看到的新頁面就和預期一樣了。

Flask從入門到精通之flask擴充套件

flask被設計成可擴充套件形式,因此並沒有提供一些重要的功能,比如資料庫和使用者認證,所以開發者可以自由選擇最適合程式的包,或者按需求自行開發。社群成員開發了大量不同用途的擴充套件,如果這還不能滿足需求,你還可使用所有python 標準包或 庫。為了讓你知道如何把擴充套件整合到程式中,接下來我們將...

Flask從入門到精通之flask安裝

安裝flask最簡單的方式是使用虛擬環境,虛擬環境是python直譯器的乙個私有副本,在這個環境中你可以安裝私有包,而且不會影響系統中安裝的全域性的python直譯器。虛擬環境非常有用,可以在系統的python 直譯器中避免包的混亂和版本的衝突。為每個程式單獨建立虛擬環境可以保證程式只能訪問虛擬環境...

Flask從入門到精通之flask程式入門

所有flask程式都必須建立乙個程式例項,web伺服器使用一種名為web伺服器閘道器介面的的協議 wsgi 把接收自客戶端的所有請求 給這個物件處理。程式例項是flask類的物件,使用下面 構建 from flask import flaskflask類的建構函式只有乙個必須指定的引數,即程式主模組...