Flask—WTF(集成的web表單處理)理論

1 作用

flask-wtf

  • 避免重複操作, 表單操作很多;
  • 防止表單遭遇跨站請求僞造(csrf===cross-site request forgery);
    在這裏插入圖片描述

2 爲什麼使用Flask-WTF?

request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。
儘管Flask的request對象提供的支持足以處理web表單,但依然有許多任務會變得單調且重複。表單的HTML代碼生成和驗證提交的表單數據就是兩個很好的例子。
優勢:

  • Flask-WTF擴展使得處理web表單能獲得更愉快的體驗。該擴展是一個封裝了與框架無關的WTForms包的Flask集成。

3 什麼是表單處理?

在網頁中,爲了和用戶進行信息交互總是不得不出現一些表單。flask設計了WTForm表單庫來使flask可以更加簡便地管理操作表單數據。
WTForm中最重要的幾個概念如下:

  • 1). Form類,開發者自定義的表單必須繼承自Form類或者其子類。
    Form類最主要的功能是通過其所包含的Field類提供對錶單內數據的快捷訪問方式。
  • 2). 各種Field類,即字段。一般而言每個Field類都對應一個input的HTML標籤。
    比如WTForm自帶的一些Field類比如BooleanField就對應<inputtype=“checkbox”>, SubmitField就對應<inputtype=“submit”>等等。
  • 3). Validator類。這個類用於驗證用戶輸入的數據的合法性。比如Length驗證器可以用於驗證輸入數據的長度,FileAllowed驗證上傳文件的類型等等。

另外,flask爲了防範csrf(cross-site request forgery,跨站請求僞造)攻擊,默認在使用flask-wtf之前要求app一定要設置過secret_key。最簡單地可以通過app.config[‘SECRET_KEY’] = 'xxxx’來配置。

4 常見的Field類型

字段類型 說明
PasswordField 密碼字段,自動將輸入轉化爲小黑點
DateField 文本字段,格式要求爲datetime.date一樣
IntergerField 文本字段,格式要求是整數
DecimalField 文本字段,格式要求和decimal.Decimal一樣
FloatField 文本字段,值是浮點數
BooleanField 複選框,值爲True或者False
RadioField 一組單選框
SelectField 下拉列表,需要注意一下的是choices參數確定了下拉選項, 但是和HTML中的 標籤一樣,其是一個tuple組成的列表,可以認爲每個tuple的第一項是選項的真正的值,而第二項是alias。
MultipleSelectField 可選多個值的下拉列表

在這裏插入圖片描述

5 Validator 驗證函數

Validator是驗證函數,把一個字段綁定某個驗證函數之後,flask會在接收表單中的數據之前對數據做一個驗證,如果驗證成功纔會接收數據。驗證函數Validator如下,具體的validator可能需要的參數不太一樣,這裏只給出一些常用的,更多詳細的用法可以參見wtforms/validators.py文件的源碼,參看每一個validator類需要哪些參數:
基本上每一個validator都有message參數,指出當輸入數據不符合validator要求時顯示什麼信息。

驗證函數 說明
Email 驗證電子郵件地址的合法性,要求正則模式是.+@([.@][^@]+)$
EqualTo 比較兩個字段的值,通常用於輸入兩次密碼等場景,可寫參數fieldname,不過注意其是一個字符串變量,指向同表單中的另一個字段的字段名。
IPAddress 驗證IPv4地址,參數默認ipv4=True,ipv6=False。如果想要驗證ipv6可以設置這兩個參數反過來。
Length 驗證輸入的字符串的長度,可以有min,max兩個參數指出要設置的長度下限和上限, 注意參數類型是字符串,不是INT!!
NumberRange 驗證輸入數字是否在範圍內,可以有min和max兩個參數指出數字上限下限,注意參數類型是字符串,不是I數裏可以設置%(min)s和%(max)s兩個格式化部分,來告訴前端這個範圍到底是多少。其他validator也有這種類似的小技巧,可以參看源碼。
Optional 無輸入值時跳過同字段的其他驗證函數
Required 必填字段
Regexp 用正則表達式驗證值,參數regex=‘正則模式’
URL 驗證URL,要求正則模式是[a-z]+://(?P<host>[/:]+)(?P< port>:[0-9]+)?(?P< path>/.*)?$
AnyOf 確保值在可選值列表中。
NoneOf 確保值不在可選值列表中

在這裏插入圖片描述

6 flask-wtf的使用流程

  • 1). 編寫forms.py文件, 定義一個關於表單的類;(***注意: 一定要有提交的按鈕);

  • 2). 業務邏輯文件app.py中,
    - 實例化表單類; form = RegisterForm()
    - 驗證表單內容是否提交成功? form.validate_on_submit():
    - 獲取表單裏面的內容(兩種方法):
    - 通過request對象獲取: request.form[‘key值’];
    - 通過form對象獲取: form.key值.data

  • 3). 表現邏輯文件wtf.html中:
    - 導入wtf模塊: {% import “bootstrap/wtf.html” as wtf %}
    - 自動生成表單對應的html: {{ wtf.quick_form(form) }}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章