flask(3):表單處理
表單在網站中用於資料採集功能。
在flask程式中,能夠滿足基本的資訊,比如request.form可以獲取post請求中提交的表單資料。
可,當需要重複操作並驗證表單內容時,程式碼量會急劇增多,不易維護。
flask提供了專門處理表單的拓展:flask-WTF
一:需要的包
wtforms: form元件,主要用於對使用者請求資料進行驗證
flask-WTF:對獨立的wtforms包進行包裝,方便整合到flask程式中
請自行安裝,安裝命令:pip install XXXX
二:跨站請求偽造保護
跨站請求偽造(CSRF)是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法。
為實現CSRF保護,flask-WTF需要程式設定一個祕鑰,使用祕鑰生成加密令牌,再用令牌驗證資料表單的真偽。
app.config['SERECT_KEY']
三:表單
1:建立一個表單類,繼承於FlaskForm
對於每一個表單,建立一個表單類,繼承於flask-wtf中的FlaskForm。例如,登入表單
class LoginForm(FlaskForm)
2:確定該表單需要的欄位
登入時,需要使用者名稱username,密碼passwd,提交按鈕submit
3:確定欄位的型別
username為文字型別,passwd為密碼型別,submit為提交按鈕
附:wtforms支援的HTML標準欄位:
4:新增驗證條件
對於使用者名稱,驗證是否為空,對於密碼,驗證長度。
附:wtforms驗證函式:
經過以上四步,得到完整的表單類:
四:渲染為HTML
1:直接傳遞form函式
直接讀取form物件的各個屬性,用於在頁面中顯示,例如,{{ form.submit() }}
特點:直觀,容易理解
缺點:程式碼量大,樣式簡陋,需要改變屬性用於美觀介面時,工作量大。
2:利用bootstrap提供的函式
{% import 'bootstrap/wtf.html' as wtf %} #匯入bootstrap中的wtf檔案,匯入語句與python一致
{{ wtf.quick_form(form) }} #利用檔案中的quick_form()函式渲染表單
特點:操作簡單,程式碼量少
五:在檢視函式中處理表單
1:用post提交表單資料(GET方法可以提交表單,但提交後資料會以查詢字串的形式附加到URL中)
app.route裝飾器的methods引數,可以接收請求方法的列表。不增加post請求時,預設只有GET請求。
2:例項化表單(將之前建立的表單類進行例項化)
例項化後,用於傳遞引數並驗證。
3:驗證(validate_on_submit函式可查詢驗證結果)
資料通過所有驗證(定義欄位時新增的驗證),則返回True
4:傳遞表單並渲染
經過以上四步,得到基本的檢視函式:
六:重定向與使用者會話
現象:表單中填入資料並提交後,重新整理瀏覽器,會出現警告資訊:
這是因為在重新整理瀏覽器時,會預設傳送最後一個請求,而提交表單的最後一個請求時POST。所以,為了消除這樣的警告,就要讓最後一個請求,不是POST。
具體:使用重定向作為POST請求的響應,而不是常規響應
原理:重定向的響應內容是URL,瀏覽器收到時,會向該URL發起GET請求,顯示頁面內容,所以,最後一個請求是GET請求。
這種狂拽酷炫吊炸天的操作叫做:Post/重定向/Get模式
操作:藉助兩個函式redirect和url_for,前者用於進行重定向,後者用於通過檢視函式名找到URL
引發的狀況:
表單資料提交後,重定向響應,傳送GET請求。POST請求結束後,資料隨之丟失。
解決方案:採用session(使用者會話)來儲存資料。(操作類似字典)
(request.form和form直接獲取均可,從session中取資料時建議get方法,參照字典)
七:flash訊息
目的——>用確認訊息,警告,錯誤提醒等,讓使用者知道狀態發生了變化
檢視函式中flash()定義訊息
在模板中用get_flashed_message()顯示