官方文檔
在Flask項目開發(fā)中針對提交表單的校驗伺通,可以使用Flask-WTF擴展庫進行快速的字段校驗箍土,也可以進行頁面快速渲染,并提供跨站請求偽造的保護功能罐监。
安裝Flask-WTF
pip install flask-wtf
實現(xiàn)注冊功能
注冊表單模型定義
在定義的表單類中定義需要驗證的username吴藻、password和password2字段,并實現(xiàn)如下校驗:
校驗密碼password2和password相等
校驗用戶名是否存在
校驗用戶名的長度是否符合規(guī)范
# 導(dǎo)入擴展類
from flask_wtf import FlaskForm
# 導(dǎo)入驗證字段
from wtforms import StringField, SubmitField, ValidationError
# 導(dǎo)入表單驗證
from wtforms.validators import DataRequired, EqualTo
from user.models import User
class UserRegisterForm(FlaskForm):
"""
登錄注冊表單驗證
"""
username = StringField('用戶名', validators=[DataRequired()])
password = StringField('密碼', validators=[DataRequired()])
password2 = StringField('確認密碼', validators=[DataRequired(),
EqualTo('password', '密碼不一致')]
)
submit = SubmitField('注冊')
def validate_username(self, field):
# 驗證用戶名是否重復(fù)
if User.query.filter(User.username == field.data).first():
raise ValidationError('用戶名已存在')
# 對用戶名的長度進行判斷
if len(field.data) < 3:
raise ValidationError('用戶名長度不能少于3個字符')
if len(field.data) > 6:
raise ValidationError('用戶名長度不能大于6個字符')
注意: 驗證字段的方法名為: validate_字段(self, field)
定義注冊視圖函數(shù)
當(dāng)HTTP請求為GET時弓柱,將表單驗證對象返回給頁面沟堡。
當(dāng)HTTP請求為POST時,通過方法validate_on_submit()方法進行字段校驗和提交判斷矢空,如果校驗失敗航罗,則可以從form.errors中獲取錯誤信息。
如果驗證通過妇多,則從form.字段.data中獲取到字段的值伤哺。
@user_blueprint.route('/register/', methods=['GET', 'POST'])
def register():
form = UserRegisterForm()
if request.method == 'GET':
return render_template('register.html',form=form)
if request.method == 'POST':
# 驗證提交的字段信息
if form.validate():
username = form.username.data
password = form.password.data
# 實現(xiàn)注冊,保存用戶信息到User模型中
user = User()
user.username = username
user.password = generate_password_hash(password)
user.save()
return redirect(url_for('user.login'))
# 驗證失敗者祖,from.errors中存在錯誤信息
return render_template('register.html',form=form)
模板展示
注冊模板采用繼承父模板base.html的形式。在register.html模壓中分析如下:
- 定義字段名: {{ form.字段.label }}
- 定義input輸入框: {{ form.字段 }}
- 展示錯誤信息: {{ form.errors.字段 }}
- 跨站請求偽造: {{ form.csrf_token }}
注冊register.html頁面如下:
{% extends 'base.html' %}
{% block content %}
<form action="" method="post">
{{ form.csrf_token }}
{{ form.username.label }} : {{ form.username }}
{% if form.errors %}
{{ form.errors.password2[0] }}
{% endif %}<br>
{{ form.password.label }} : {{ form.password }}<br>
{{ form.password2.label }} : {{ form.password2 }}
{% if form.errors %}
{{ form.errors.password2[0] }}
{% endif %}<br>
{{ form.submit() }}
</form>
{% endblock %}
注意: 通過form.字段解析的input標(biāo)簽中可以自定義樣式绢彤,如{{ form.字段(class='xxx'七问, style='color:red') }}
常見字段類型
字段類型 | 說明 |
---|---|
StringField | 普通文本字段 |
PasswordField | 密碼文本字段 |
SubmitField | 提交按鈕 |
HiddenField | 隱藏文本字段 |
TextAreaField | 多行文本字段 |
DateField | 文本字段,datetime.date格式 |
DateTimeField | 文本字段茫舶,datetime.datetime格式 |
IntegerField | 文本字段械巡,整數(shù)類型 |
FloatField | 文本字段,小數(shù)類型 |
BooleanField | 復(fù)選框饶氏,值為True或False |
RadioField | 單選框 |
SelectField | 下拉列表 |
FileField | 文件上傳字段 |
驗證器
驗證器 | 說明 |
---|---|
DataRequired | 確保字段有值(并且if判斷為真) |
郵箱地址 | |
IPAddress | IPv4的IP地址 |
Length | 規(guī)定字符長度 |
NumberRange | 輸入數(shù)值的范圍 |
EqualTo | 驗證兩個字段的一致性 |
URL | 有效的URL |
Regexp | 正則驗證 |