1. 程式人生 > >flask(3):表單處理

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()顯示