Flask-WTF是一個(gè)集成了WTForms的Flask的擴(kuò)展 ,可以創(chuàng)建表單類(lèi)進(jìn)行驗(yàn)證骗奖,也可在HTML中進(jìn)行渲染表單
創(chuàng)建表單類(lèi)
每個(gè)表單都用一個(gè)繼承自Form的類(lèi)表示解愤,每個(gè)字段都用一個(gè)對(duì)象表示,每個(gè)對(duì)象可以附加多個(gè)驗(yàn)證函數(shù)说订。
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField,PasswordField
from wtforms.validators import DataRequired,Length,Email
class LoginForm(FlaskForm):
username = StringField('用戶(hù)名'听诸,validators=[DataRequired(message='用戶(hù)名不能為空'),Length[1,64],])
password = PasswordField('密碼',validators=[DataRequired(message='密碼不能為空')])
sumbit = SubmitField('登陸')
常用的表單字段有:
StringFileld 文本字段
TextAreaField 多行文本
PasswordField 密碼文本
SubmitField 表單提交按鈕
常用的驗(yàn)證函數(shù):
Email 驗(yàn)證是郵箱地址
EqualTo 比較兩個(gè)字段的值坐求,一般用于輸入兩個(gè)密碼的驗(yàn)證
Length[1,10] 驗(yàn)證長(zhǎng)度
Required() 確保字段中有數(shù)據(jù)
表單渲染
首先在是視圖函數(shù)中引入一個(gè)表單類(lèi)的實(shí)例,然后在返回模版的時(shí)候傳入實(shí)例
@blue.route('/login/',methods=['POST','GET'])
def login():
form = LoginForm()
if request.method == 'GET':
return render_template('login.html',form=form)
if request.method == 'POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
....
return redirect(url_for('user.index'))
Login.html
<form method='post' action='.'>
{{ form.csrf.token }}
{{ form.usrname.label }}:{{ form.username }}
{{ form.password.label }}:{{ form.password }}
{{ form.sumbit() }}
</form>
{{ if form.errors }}
{{ form.errors }}
{{ endif }}
- 定義字段名:{{ form.字段名.label }}
- 定義input輸入框:{{ form.字段 }}
- 展示錯(cuò)誤信息:{{ form.errors.字段 }}
- 跨站請(qǐng)求偽造:{{ form.csrf_token }}
驗(yàn)證數(shù)據(jù)
當(dāng)我們點(diǎn)擊了提交按鈕時(shí)晌梨,form.validate_on_submit()判斷會(huì)做出兩件事情:
- 通過(guò)is_submitted()通過(guò)判斷HTTP方法來(lái)確定是否提交了表單
- 通過(guò)WTForms提供的validate()來(lái)驗(yàn)證表單數(shù)據(jù) (使用我們?cè)谧铋_(kāi)始寫(xiě)的表單類(lèi)中給每個(gè)字段傳入的驗(yàn)證函數(shù))
自定義驗(yàn)證
可以在表單類(lèi)創(chuàng)建自定義的驗(yàn)證函數(shù)
class LoginResigterForm(FlaskForm)
....
def validate_username(self,field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('用戶(hù)名被注冊(cè)')
這里用來(lái)驗(yàn)證用戶(hù)名是否已經(jīng)存在桥嗤, field.data 是數(shù)據(jù)
自定義驗(yàn)證函數(shù)時(shí),validate_username 時(shí)對(duì)應(yīng)的是上面寫(xiě)的username字段仔蝌,fileld.data也是在頁(yè)面出輸入的username的值
獲取數(shù)據(jù)
驗(yàn)證通過(guò)時(shí)泛领,我們可以使用form.字段名.data來(lái)獲得數(shù)據(jù)