本文主要是介绍表单验证(WTF),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
官方文档
在Flask项目开发中针对提交表单的校验,可以使用Flask-WTF扩展库进行快速的字段校验,也可以进行页面快速渲染,并提供跨站请求伪造的保护功能。
安装Flask-WTF
pip install flask-wtf
实现注册功能
注册表单模型定义
在定义的表单类中定义需要验证的username、password和password2字段,并实现如下校验:
校验密码password2和password相等
校验用户名是否存在
校验用户名的长度是否符合规范
# 导入扩展类from flask_wtf import FlaskForm# 导入验证字段from wtforms import StringField, SubmitField, ValidationError# 导入表单验证from wtforms.validators import DataRequired, EqualTofrom user.models import Userclass UserRegisterForm(FlaskForm):"""登录注册表单验证"""username = StringField('用户名', validators=[DataRequired()])password = StringField('密码', validators=[DataRequired()])password2 = StringField('确认密码', validators=[DataRequired(),EqualTo('password', '密码不一致')])submit = SubmitField('注册')def validate_username(self, field):# 验证用户名是否重复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)
定义注册视图函数
当HTTP请求为GET时,将表单验证对象返回给页面。
当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.datapassword = form.password.data# 实现注册,保存用户信息到User模型中user = User()user.username = usernameuser.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标签中可以自定义样式,如{{ form.字段(class='xxx', style='color:red') }}
常见字段类型
字段类型 | 说明 |
---|---|
StringField | 普通文本字段 |
PasswordField | 密码文本字段 |
SubmitField | 提交按钮 |
HiddenField | 隐藏文本字段 |
TextAreaField | 多行文本字段 |
DateField | 文本字段,datetime.date格式 |
DateTimeField | 文本字段,datetime.datetime格式 |
IntegerField | 文本字段,整数类型 |
FloatField | 文本字段,小数类型 |
BooleanField | 复选框,值为True或False |
RadioField | 单选框 |
SelectField | 下拉列表 |
FileField | 文件上传字段 |
验证器
验证器 | 说明 |
---|---|
DataRequired | 确保字段有值(并且if判断为真) |
邮箱地址 | |
IPAddress | IPv4的IP地址 |
Length | 规定字符长度 |
NumberRange | 输入数值的范围 |
EqualTo | 验证两个字段的一致性 |
URL | 有效的URL |
Regexp | 正则验证 |
这篇关于表单验证(WTF)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!