在Python的Flask中使用WTForms表单框架的基础教程

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()

猜你喜欢

转载自blog.csdn.net/yy19890521/article/details/81357277