1 Flask WTF
Web应用程序的一个重要方面是为用户提供用户界面。HTML提供了一个标签,用于设计界面。可以适当地使用Form(表单)元素,例如文本输入,单选按钮,选择等。
用户输入的数据以Http请求消息的形式通过GET或POST方法提交给服务器端脚本。
- 服务器端脚本必须从http请求数据重新创建表单元素。因此,实际上,表单元素必须定义两次 一次在HTML中,另一次在服务器端脚本中。
- 使用HTML表单的另一个缺点是很难(如果不是不可能的话)动态呈现表单元素。HTML本身无法验证用户的输入。
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据。使用Flask-WTF,我们可以在Python脚本中定义表单字段,并使用HTML模板进行渲染。还可以将验证应用于WTF字段。
三方包安装:
pip install flask-WTF
标准表单字段
WTforms包中包含各种表单字段的定义。下面列出了一些标准表单字段:
字段名 | 说明 |
---|---|
StringField | 文本字段,表示 HTML表单元素 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False。表示 HTML表单元素 |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文本上传字段 |
SubmitField | 表单提交按钮 ,表示表单元素 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
WTForms常用验证函数
验证函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
检查字段中的文本是否遵循电子邮件ID约定 | |
IPAddress | 在输入字段中验证IP地址 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入的字符串长度 |
NumberRange | 验证输入的值在数字范围内 |
URL | 验证URL |
AnyOf | 验证输入值在可选列表中 |
NoneOf | 验证输入值不在可选列表中 |
注意:
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
用法示例:
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField, RadioField, IntegerField, SelectField
from wtforms import validators, ValidationError
from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'development key'
#定义表单模型
class ContactForm(FlaskForm):
# label: 名字 validators:验证器/验证器
name = StringField(label="名字", validators=[validators.DataRequired("输入名字")])
gender = RadioField(label='性别', choices=[('M', 'Male'), ('F', 'Female')])
address = TextAreaField(label="地址")
email = StringField(label="邮箱", validators=[validators.DataRequired("输入邮件地址"),
validators.Email("输入邮件地址,必须满足格式**@**")])
age = IntegerField(label="年龄")
language = SelectField(label='语言', choices=[('cpp', 'C++'),
(