在Flask中,为了处理web表单,我们可以使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能
WTForms支持的HTML标准字段
字段对象 说明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文件字段
DateField 文本字段,值为datetime.date文本格式
DateTimeField 文本字段,值为datetime.datetime文本格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为浮点数
BooleanField 复选框,值为True和False
RadioField 一组单选框
SelectField 下拉列表
SelectMutipleField 下拉列表
FileField 文件上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段
WTForms常用验证函数
验证函数 说明
DataRequired 确保字段中有数据
EqualTo 比较两个字段的值,常用于比较两次密码输入 ,里面的参数是你要验证的表单框名,不是值, 表单框名要加引号
Length 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中
使用Flask-WTF需要配置参数SECRET_KEY
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密钥生成加密令牌,在HTML页面中直接写form表单
即在html页面<form>表单里写
{{reg.csrf_token()}} reg是你传过来的表单数据
宏:
{% macro input(label=‘‘,type=‘‘,name=‘‘,value=‘‘)%}
{{ label }}<input type="{{ type }}" name="{{ name }}" value="{{ value }}"><br>
{% endmacro %}
{{ m }}<br>
参数值为:{{ params }}<br>
是否都有值:{{ if_all }}<br>
<form method="post">
{{ input(label=‘用户名:‘,type=‘text‘,name=‘username‘) }}
{{ input(label=‘密码:‘,type=‘password‘,name=‘password‘) }}
{{ input(label=‘确认密码:‘,type=‘password‘,name=‘password2‘) }}
{{ input(type=‘submit‘,value=‘登录‘) }}
</form>
实例代码:
py文件
from flask import Flask,render_template,request,flash
# 导入验证层
from flask_wtf import FlaskForm
# 导入需要的字段的包
from wtforms import StringField,PasswordField
# 导入验证字段的包
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
app.config[‘SECRET_KEY‘] = "asdfdcs"
# 继承验证类就能使用验证类的很多方法 对传递过来的字段进行验证
class RegisterForm(FlaskForm):
username = StringField(‘用户名‘,validators=[DataRequired(message=‘用户名不能为空‘)]) # 通过StringField生成字符串,再通过validators参数传递多个验证规则,列表类型
password = PasswordField(‘密码‘,validators=[DataRequired(message=‘密码不能为空‘)])
password2 = PasswordField(‘确认密码‘,validators=[DataRequired(message=‘确认密码不能为空‘),EqualTo(‘password‘,message=‘两次密码不一样‘)]) #!!!!!!!!!password要加引号,是根据表单名判断的
@app.route(‘/‘,methods=[‘POST‘,‘GET‘])
def reg():
register_form = RegisterForm()
if request.method==‘POST‘:
if register_form.validate_on_submit():
flash("注册成功")
else:
flash("注册失败")
return render_template(‘7.html‘,register_form = register_form)
if __name__ == ‘__main__‘:
app.run(debug=True)
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{{ reg.csrf_token() }} #让网页可以加载表单
{{ reg.username.label }}{{ reg.username }}<br>
{{ reg.password.label }}{{ reg.password }}<br>
{{ reg.password2.label }}{{ reg.password2 }}<br>
{{ reg.submit }}
</form>
{% for message in get_flashed_messages() %} #这是个函数 后面要加括号
<span style="color: cornflowerblue">{{ message }}</span>
{% endfor %}
<br>
{% for value in reg.errors.values() %} #如果表框里输入的内容不符合规则 则会闪现出错误
{{ value[0] }}
{% endfor %}
</body>
</html>
原文地址:https://www.cnblogs.com/sll-csdn/p/10926179.html