Flask-wtf表單處理
Flask-wtf表單處理
1. 為什麼使用Flask-WTF?
request物件公開了所有客戶端傳送的請求資訊。特別是request.form可以訪問POST請求提交的表單資料。
儘管Flask的request物件提供的支援足以處理web表單,但依然有許多工會變得單調且重複。
表單的HTML程式碼生成和驗證提交的表單資料就是兩個很好的例子。
優勢:
Flask-WTF擴充套件使得處理web表單能獲得更愉快的體驗。該擴充套件是一個封裝了與框架無關的WTForms包的Flask整合。
2. 什麼是表單處理?
在網頁中,為了和使用者進行資訊互動總是不得不出現一些表單。
flask設計了WTForm表單庫來使flask可以更加簡便地管理操作表單資料。
WTForm中最重要的幾個概念如下:
-
1). Form類,開發者自定義的表單必須繼承自Form類或者其子類。
Form類最主要的功能是通過其所包含的Field類提供對錶單內資料的快捷訪問方式。 -
2). 各種Field類,即欄位。一般而言每個Field類都對應一個input的HTML標籤。
比如WTForm自帶的一些Field類比如BooleanField就對應,
SubmitField就對應等等。 -
3). Validator類。這個類用於驗證使用者輸入的資料的合法性。
比如Length驗證器可以用於驗證輸入資料的長度,
FileAllowed驗證上傳檔案的型別等等。 -
另外,flask為了防範csfr(cross-site request forgery)攻擊,
預設在使用flask-wtf之前要求app一定要設定過secret_key。
最簡單地可以通過app.config['SECRET_KEY'] = 'xxxx'
來配置。
3. 常見的Field類
類別 | 意義 |
---|---|
PasswordField | 密碼欄位,自動將輸入轉化為小黑點 |
DateField | 文字欄位,格式要求為datetime.date一樣 |
IntergerField | 文字欄位,格式要求是整數 |
DecimalField | 文字欄位,格式要求和decimal.Decimal一樣 |
FloatField | 文字欄位,值是浮點數 |
BooleanField | 複選框,值為True或者False |
RadioField | 一組單選框 |
SelectField | 下拉列表,需要注意一下的是choices引數確定了下拉選項,但是和HTML中的 標籤一樣,其是一個tuple組成的列表,可以認為每個tuple的第一項是選項的真正的值,而第二項是alias。 |
MultipleSelectField | 可選多個值的下拉列表 |
4.Validator驗證函式
Validator是驗證函式,把一個欄位繫結某個驗證函式之後,flask會在接收表單中的資料之前對資料做一個驗證,
如果驗證成功才會接收資料。驗證函式Validator如下,具體的validator可能需要的引數不太一樣,這裡只給出
一些常用的,更多詳細的用法可以參見wtforms/validators.py檔案的原始碼,參看每一個validator類需要哪些引數
*基本上每一個validator都有message引數,指出當輸入資料不符合validator要求時顯示什麼資訊。
類別 | 意義 |
---|---|
驗證電子郵件地址的合法性,要求正則模式是[email protected]([[email protected]][^@]+)$ | |
EqualTo | 比較兩個欄位的值,通常用於輸入兩次密碼等場景,可寫引數fieldname,不過注意其是一個字串變數,指向同表單中的另一個欄位的欄位名 |
IPAddress | 驗證IPv4地址,引數預設ipv4=True,ipv6=False。如果想要驗證ipv6可以設定這兩個引數反過來。 |
Length | 驗證輸入的字串的長度,可以有min,max兩個引數指出要設定的長度下限和上限,注意引數型別是字串,不是INT!! |
NumberRange | 驗證輸入數字是否在範圍內,可以有min和max兩個引數指出數字上限下限,注意引數型別是字串,不是INT!!然後在這個validator的message引數裡可以設定%(min)s和%(max)s兩個格式化部分,來告訴前端這個範圍到底是多少。其他validator也有這種類似的小技巧,可以參看原始碼。 |
Optional | 無輸入值時跳過同欄位的其他驗證函式 |
Required | 必填欄位 |
Regexp | 用正則表示式驗證值,引數regex=‘正則模式’ |
URL | 驗證URL,要求正則模式是[a-z]+://(?P<host>[/:]+)(?P:[0-9]+)?(?P
|
AnyOf | 確保值在可選值列表中。引數是values(一個可選值的列表)。特別提下,和SelectField進行配合使用時,不知道為什麼SelectField的choices中項的值不能是數字。。否則AnyOf的values引數中即使有相關數字也無法識別出當前選項是合法選項。我懷疑NoneOf可能也是一樣的套路。 |
NoneOf | 確保值不在可選值列表中 |