1.原始的表单验证
页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<lable>用户名:</lable><input type="text" name="username"><br>
<lable>密码:</lable><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
</form>
{# 使用遍历获取闪现的消息 #}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</body>
</html>
验证代码:
# 表单 Flask-WTF扩展
'''
目的:实现一个简单的登陆的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数(从表单中拿到数据)
3.判断参数是否填写,以及密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash --> 需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板中需要遍历flash消息
'''
from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'itheima'
@app.route('/', methods=['GET','POST'])
def index():
#request:请求对象 --> 获取请求方式、数据
#1. 判断请求方式
if request.method == 'POST':
# 2.获取请求的参数 request(通过input中的name值)
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
print(username,password,password2)
# 3.判断参数是否填写&密码是否相同(u是为了解决编码问题)
if not all([username,password,password2]):
# print('参数不完整')
flash(u'参数不完整')
elif password != password2:
# print('密码不一致')
flash(u'密码不一致')
else:
return 'success'
return render_template('form.html')
if __name__ == '__main__':
app.run(debug=True)
2.Flask-WTF的表单验证
WTForms常用验证函数:
- DataRequireed 确保字段中有数据
- EnqualTo 比较两个字段的值,常用于比较两次密码输入
- Length 验证输入的字段长度
- NumberRange 验证输入的值在数字范围内
- URL 验证URL
- AnyOf 验证输入值在可选列表中
- NoneOf 验证输入值不在可选列表中
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密钥生成加密令牌。
页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{# 设置scrf_token #}
{{ form.csrf_token() }}
{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit }}
</form>
</body>
</html>
逻辑代码:
#coding=utf-8
#python3中的reload的使用
import importlib
from flask import Flask, render_template, request, flash
app = Flask(__name__)
# 导入tf扩展的表单类
from flask_wtf import FlaskForm
#导 入自定义表单需要的字段
from wtforms import SubmitField, StringField, PasswordField
#导入wtf扩展提供的表单验证
from wtforms.validators import DataRequired, EqualTo
# 解决编码问题
import io,sys
# sys.stdout = io.TextIOWrapper(sys.stdout.detch(), encoding='utf-8')
# sys.stderr = ioTextIOWrapper(sys.stderr.detch(), encoding='utf-8')
# importlib.reload(sys)
# sys.set
# 自定义表单类、文本字段、密码字段、提交按钮
# 使用WTF实现表单 需要自定义一个表单类
class LoginForm(FlaskForm):
# StringField/PasswordField是区别文本框类型, 用户名/密码是指定label值, validators 就是指明要验证哪些项
username = StringField('用户名:', validators=[DataRequired()])
password = PasswordField('密码:',validators=[DataRequired()])
password2 = PasswordField('确认密码:', validators=[DataRequired(), EqualTo('password', '密码填入的不一致')])
submit = SubmitField('提交')
# 定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route('/form',methods=['GEt','POST'])
def login():
# 由RegisterForm类生成一个表实例
login_form = LoginForm()
# 逻辑处理
if request.method == 'POST':
# 获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 调用validation_on_submit方法,可以一次性执行完所有验证函数的逻辑
if login_form.validate_on_submit():
# 进入这里就表示所有的逻辑都验证成功
print(username)
return 'success'
else:
#message = register_form.get('password2')[0]
#flash(message)
flash('参数有误')
# 把实例化后的register_form传入到页面wtf.html中
return render_template('wtf.html',form=login_form)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__mian__':
app.run()