web表单是web应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。
表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。
WTForms中支持的HTML标准字段
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
passwordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框 值为True或者False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选多个值 |
FileField | 文本上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入到另一个表单 |
FieldList | 一组指定类型的字段 |
WTForms常用验证函数
验证函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入的字符串的长度 |
NumberRange | 验证输入的值在数字的范围之内 |
URL | 验证URL |
AnyOf | 验证输入值在可选的列表中 |
NoneOf | 验证输入值不在可选列表中 |
配置SECRET_KEY
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
# coding:utf-8
from flask import Flask,render_template,request
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
# 如果使用wtf框架,在内部已经使用了session
app.config["SECRET_KEY"] = 'ryang'
class RegisterForm(FlaskForm):
"""定义自己的注册类"""
# DataRequired :必须输入值
# validator: 校验
user_name = StringField(label = u"用户名",validators=[DataRequired(u'必须填写用户名')])
password = PasswordField(label=u'密码',validators=[DataRequired(u'必须填写密码')])
# EqualTo(""):第一参数表示想要跟谁校验 第二个参数是提示信息
password2 = PasswordField(label=u'确认密码',validators=[DataRequired(u'必须填写密码'),
EqualTo('password',u'两次输入不一致')])
submit = SubmitField(u'注册')
@app.route("/register",methods=["GET","POST"])
def register():
if request.method == "GET":
form = RegisterForm()
return render_template('05_wtf.html',form = form)
else:
form = RegisterForm()
# validate_on_submit:作用是在提交的时候进行检验
# true表示校验通过 false表示校验失败
if form.validate_on_submit():
name = form.user_name.data
pwd = form.password.data
print("name = %s" %name)
print("pwd = %s" %pwd)
return "注册成功"
else:
return render_template("05_wtf.html",form = form)
if __name__ == '__main__':
app.run(debug=True)
第二种实现思路:
# coding:utf-8
from flask import Flask,render_template
from flask import redirect,session,url_for
from flask import request,flash
# 导入wtf扩展的类
from flask_wtf import FlaskForm
# 导入自定义表单需要的数据
from wtforms import SubmitField,StringField,PasswordField
# 导入wtf扩展需要的表单验证器
# from wtforms.form import Form
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
# 配置参数 防止csrf跨站攻击
app.config['SECRET_KEY'] = 'silents is gold'
# 自定义表单类、文本字段、密码字段和提交按钮
class Login(FlaskForm):
us = StringField(label=u'用户',validators=[DataRequired()])
ps = PasswordField(label=u'密码',validators=[DataRequired(),EqualTo('ps2','err')])
ps2 = PasswordField(label=u'确认密码',validators=[DataRequired()])
submit = SubmitField(u'提交')
@app.route('/login')
def login():
return render_template('login.html')
# 根据路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route("/",methods=['GET',"POST"])
def index():
form = Login()
if form.validate_on_submit():
name = form.us.data
pswd = form.ps.data
pswd2 = form.ps2.data
print(name,pswd,pswd2)
return '注册成功!'
else:
if request.method == "POST":
flash(u'信息有误,请重新输入!')
# 进入此处说明是get请求 打印一个false 然后返回login页面
print(form.validate_on_submit())
return render_template('login.html',form=form)
if __name__ == '__main__':
app.run(debug=True)