flask之表单验证 2018.12.23
#flask的消息闪现依赖于flash库,用户发送的请求方式存储在request模块中
#跳转依赖于redirect模块,还可以通过url_for方法来进行方法上的寻址
from flask import Flask,flash,render_template,request,session,redirect,url_for
#导入wtf扩展的表单类
from flask_wtf import FlaskForm
#导入自定义表单需要用到的字段类型
from wtforms import SubmitField,StringField,PasswordField
#新建一个表单类
class RegisterForm(FlaskForm):
username = StringField('用户名')
password = PasswordField('密码')
password1 = PasswordField('确认密码')
submit = SubmitField('注册')
#建立对象
app = Flask(__name__)
#载入配置文件
app.config.from_pyfile('config.ini')
#登陆成功后跳转的页面
@app.route("/hello")
def hello():
return ' hello 欢迎 %s ' % session['username']
#指定请求方式,使用methods属性
@app.route('/',methods=['GET','POST'])
def index():
#判断client发送的请求类型
#自己请求自己的逻辑中,GET只用来解析模板,而POST用来判断数据逻辑
if request.method == "POST":
#使用form属性来接收表单提交过来的数据
username = request.form.get("username")
password = request.form.get("password")
password1 = request.form.get("password1")
#判断数据是否同时存在
#等同于 if username == '' or password == '' or password1 == ''
if not all([username,password,password1]):
#利用闪现消息来提醒用户
flash("参数不足")
elif password != password1:
flash("两次密码不一致")
else:
#模拟登录 将用户名和密码存到session中
session['username'] = username
session['password'] = password
flash("注册成功")
#第一种直接跳转网址
#return redirect('http://localhost:5000/hello')
#第二种通过url_for方法跳转
return redirect(url_for(hello))
#将定义好的表单类传递给模板,进行方法化设置
return render_template('day04_wtform.html',form=RegisterForm())
if __name__ == "__main__":
app.run()
模板页(day04_wtform.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>wtfrom</title>
</head>
<body>
<form method='POST'>
{#所有通过调用出来的值必须要和后台表单类定义的变量一致#}
{{ form.username.label}}:{{form.username}}
{{ form.password.label}}:{{form.password}}
{{ form.password1.label}}:{{form.password1}}
{# 将flash消息闪现和后台联系起来 #}
{# 将消息闪现里面的所有消息遍历,取出需要返回给用户的信息 #}
{% for message in get_flashed_messages() %}
{{message}}
{%endfor%}
{{form.submit}}
</form>
</body>
</html>