1. 程式人生 > >Flask-wtf表單處理

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 驗證電子郵件地址的合法性,要求正則模式是[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 確保值不在可選值列表中