一、表单模型验证(必须写秘钥,否则报错)
使用Flask-WTF表单扩展(表单模型验证需要的库),可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据
pip install Flask-WTF
1、不使用Flask-WTF扩展时,表单需要自己处理
#模板文件
<form method="post">
<input name="text" name="username" placeholder="username">
<input name="password" name="password" placeholder="password">
<input type="submit" value="提交">
</form>
from flask import Flask, session, request, url_for, render_template
@app.route('/login', methods=['GET','POST'])
def login():
if request.method == 'POST':
username=request.form.get('username')
password = request.form['password']
return '登陆成功'
else:
return render_template("login.html")
2、进行自定义表单模型验证
- 自定义表单类,文本字段,密码字段,提交按钮
from flask import Flask, session, request, url_for, render_template, redirect
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, EqualTo #这是验证器中的函数
from wtforms import StringField, PasswordField, SubmitField #这是字段的类型
app = Flask(__name__, template_folder='templates', static_url_path='/static')
app.secret_key = '1'
#自定义注册表单模型验证
class RegisterForm(FlaskForm):
#DataRequired保证数据必须填写,并且不能为空
#label是字段的名字,validators是验证器
username = StringField(label=u'用户名', validators=[DataRequired(u'用户名不能为空')])
password = PasswordField(label=u'密码', validators=[DataRequired(u'密码不能为空')])
repeat_password = PasswordField(label=u'确认密码', validators=[DataRequired(u'确认密码不能为空'),
EqualTo('password', u'两次密码不一致')])
submit = SubmitField(label=u'提交')
@app.route('/register', methods=['GET','POST'])
def register():
#创建表单对象,如果是post请求,前端发送了数据,flask会把数据构造在form对象的时候,存在form对象中
form = RegisterForm()
#判断form中的数据是否合理
#如果form中的数据完全满足所有的验证,则返回真,否则返回否
var = form.validate_on_submit()
if var:
#表单验证合格
#提取数据
username = form.username.data
password = form.password.data
repeat_password = form.repeat_password.data
print(username, password, repeat_password)
session['username'] =username
return redirect(url_for('index'))
return render_template('HomePage/register.html', form=form)
@app.route('/index')
def index():
username = session.get('username', '')
return 'hello %s' % username
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册测试</title>
</head>
<body>
<form method="post">
{{ form.csrf_token }}
{# 标签名#}
<p>{{ form.username.label }}</p>
{# 输入框#}
<p>{{ form.username }}</p>
{# 错误提示信息#}
{% for msg in form.username.errors %}
<p>{{ msg }}</p>
{% endfor %}
{# 标签名#}
<p>{{ form.password.label }}</p>
{# 输入框#}
<p>{{ form.password }}</p>
{# 错误提示信息#}
{% for msg in form.password.errors %}
<p>{{ msg }}</p>
{% endfor %}
{# 标签名#}
<p>{{ form.repeat_password.label }}</p>
{# 输入框#}
<p>{{ form.repeat_password }}</p>
{# 错误提示信息#}
{% for msg in form.repeat_password.errors %}
<p>{{ msg }}</p>
{% endfor %}
{# 提交按钮#}
{{ form.submit }}
</form>
</body>
</html>