欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-21 16:50:58
...

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

上一篇:

下一篇: