request對象公開了全部客戶端發送的請求信息。特別是request.form能夠訪問POST請求提交的表單數據。 儘管Flask的request對象提供的支持足以處理web表單,但依然有許多任務會變得單調且重複。 表單的HTML代碼生成和驗證提交的表單數據就是兩個很好的例子。
優點:html
Flask-WTF擴展使得處理web表單能得到更愉快的體驗。該擴展是一個封裝了與框架無關的WTForms包的Flask集成。
在網頁中,爲了和用戶進行信息交互老是不得不出現一些表單。 flask設計了WTForm表單庫來使flask能夠更加簡便地管理操做表單數據。 WTForm中最重要的幾個概念以下: 1). Form類,開發者自定義的表單必須繼承自Form類或者其子類。 Form類最主要的功能是經過其所包含的Field類提供對錶單內數據的快捷訪問方式。 2). 各類Field類,即字段。通常而言每一個Field類都對應一個input的HTML標籤。 好比WTForm自帶的一些Field類好比BooleanField就對應<input type="checkbox">, SubmitField就對應<input type="submit">等等。 3). Validator類。這個類用於驗證用戶輸入的數據的合法性。 好比Length驗證器能夠用於驗證輸入數據的長度, FileAllowed驗證上傳文件的類型等等。
另外,flask爲了防範csfr(cross-site request forgery)攻擊, 默認在使用flask-wtf以前要求app必定要設置過secret_key。 最簡單地能夠經過app.config['SECRET_KEY'] = 'xxxx'來配置。前端
PasswordField 密碼字段,自動將輸入轉化爲小黑點web
DateField 文本字段,格式要求爲datetime.date同樣正則表達式
IntergerField 文本字段,格式要求是整數flask
DecimalField 文本字段,格式要求和decimal.Decimal同樣bootstrap
FloatField 文本字段,值是浮點數app
BooleanField 複選框,值爲True或者False框架
RadioField 一組單選框dom
SelectField 下拉列表,須要注意一下的是choices參數肯定了下拉選項,函數
可是和HTML中的<select> 標籤同樣,其是一個tuple組成的列表, 能夠認爲每一個tuple的第一項是選項的真正的值,而第二項是alias。
MultipleSelectField 可選多個值的下拉列表
Validator是驗證函數,把一個字段綁定某個驗證函數以後,flask會在接收表單中的數據以前對數據作一個驗證, 若是驗證成功纔會接收數據。驗證函數Validator以下,具體的validator可能須要的參數不太同樣,這裏只給出 一些經常使用的,更多詳細的用法能夠參見wtforms/validators.py文件的源碼,參看每個validator類須要哪些參數:
*基本上每個validator都有message參數,指出當輸入數據不符合validator要求時顯示什麼信息。
Email 驗證電子郵件地址的合法性,要求正則模式是^.+@(12+)$
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>3+)(?P<port>:[0-9]+)?(?P<path>/.*)?$
AnyOf 確保值在可選值列表中。參數是values(一個可選值的列表)。特別提下,和SelectField進行配合使用時,不知道爲何SelectField的choices中項的值不能是數字。。不然AnyOf的values參數中即便有相關數字也沒法識別出當前選項是合法選項。我懷疑NoneOf可能也是同樣的套路。
NoneOf 確保值不在可選值列表中
#forms.py文件:用來設定規則 from flask_wtf import FlaskForm from flask_wtf.file import FileRequired, FileAllowed from wtforms import StringField, PasswordField, SubmitField, FileField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): name = StringField( label="用戶名/郵箱/手機號", validators=[ # DataRequired("請輸入用戶名"), Length(3, 20, message="長度不符"), ] ) passwd = PasswordField( label="密碼", validators=[ # DataRequired("請輸入密碼"), Length(3, 20), ], ) file = FileField( label="簡歷", validators=[ FileRequired(), FileAllowed(['pdf', 'txt'], 'pdf 能被接收') ] )
#templates/demo/login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST" action="/login/"> {{ form.hidden_tag() }} {{ form.name.label }} {{ form.name }} {{ form.passwd.label }} {{ form.passwd }} {{ form.file }} <input type="submit" value="Go"> </form> </body> </html>
#主程序 import random from flask import Flask, redirect, render_template from forms import LoginForm from flask_bootstrap import Bootstrap app = Flask(__name__) bootstrap = Bootstrap(app) app.config['SECRET_KEY'] = random._urandom(24) @app.route('/success/') def success(): return "success" @app.route('/login/', methods=('GET', 'POST')) def submit(): # 實例化表單對象; form = LoginForm() if form.validate_on_submit(): print(form.data) return redirect('/success/') return render_template('demo/login.html', form=form) app.run()