Web框架——Flask系列之WTF表单验证练习(七)
发布日期:2021-05-08 02:34:16 浏览次数:23 分类:精选文章

本文共 5226 字,大约阅读时间需要 17 分钟。

Web表单与Flask-WTF的应用

Web表单是Web应用程序的基础功能,它在HTML页面中负责数据采集。表单主要由表单标签、表单域和表单按钮三部分组成,用于让用户输入数据并将其提交给服务器。通过表单,Web应用程序能够收集用户的输入数据,实现与服务器的交互。

在Flask框架中,处理Web表单通常使用Flask-WTF扩展。Flask-WTF基于WTForms库,提供了验证表单数据的功能,同时支持HTML标准字段和自定义验证逻辑。


WTForms的验证功能

WTForms支持多种验证函数,帮助开发者确保表单数据的有效性。以下是常用的验证函数示例:

  • DataRequired:确保字段不为空。
  • StringLength:验证字段的长度限制。
  • Regex:通过正则表达式验证字段格式。
  • EqualTo:比较两个字段是否相同。

Flask-WTF需要配置一个秘密密钥(SECRET_KEY),用于生成 CSRF令牌。设置示例如下:

app.config['SECRET_KEY'] = 'silents is gold'

使用Flask-WTF实现表单

1. 在HTML模板中编写表单

Flask-WTF支持在模板中直接使用表单字段。以下是一个简单的表单示例:

Login

2. 在视图函数中获取表单数据

视图函数可以通过request.form获取表单提交的数据。以下是一个简单的Flask路由示例:

from flask import Flask, render_template, request
app = Flask(__name__)
app.config['SECRET_KEY'] = 'silents is gold'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print(f'用户名:{username}, 密码:{password}')
return render_template('login.html')
return render_template('login.html')

3. 使用Flask-WTF实现表单验证

Flask-WTF通过自定义表单类(继承自FlaskForm)实现表单验证。以下是一个完整的表单类和视图函数示例:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
class Login(Form):
username = StringField(label='用户名', validators=[DataRequired()])
password = PasswordField(label='密码', validators=[DataRequired()])
password2 = PasswordField(label='确认密码', validators=[DataRequired(), EqualTo('password', '密码不一致')])
submit = SubmitField('登录')
@app.route('/login', methods=['GET', 'POST'])
def login():
login_form = Login()
if login_form.validate_on_submit():
username = login_form.username.data
password = login_form.password.data
print(f'登录成功,用户名:{username}, 密码:{password}')
return redirect(url_for('index'))
return render_template('login.html', form=login_form)

模板代码与Python实现

模板文件(login.html)

Login
{{ form.csrf_token() }}

{{ form.username }}

{{ form.password }}

{{ form.password2 }}

{% for message in get_flashed_messages() %}

{{ message }}

{% endfor %}

Python代码(wtf.py)

from flask import Flask, render_template, request, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.secret_key = 'Zep03'
class LoginForm(FlaskForm):
username = StringField(label='用户名', validators=[DataRequired()])
password = PasswordField(label='密码', validators=[DataRequired()])
password2 = PasswordField(label='确认密码', validators=[DataRequired(), EqualTo('password', '密码不一致')])
submit = SubmitField('登录')
@app.route('/login', methods=['GET', 'POST'])
def login():
login_form = LoginForm()
if login_form.validate_on_submit():
username = login_form.username.data
password = login_form.password.data
print(f'登录成功,用户名:{username}, 密码:{password}')
return redirect(url_for('index'))
return render_template('login.html', form=login_form)

效果图及目录结构

以下是文章的目录结构和效果图:

  • 目录结构

    .
    ├── __init__.py
    ├── forms/
    │ ├── __init__.py
    │ ├── models/
    │ │ └── login.py
    │ ├── routes/
    │ │ └── login.py
    │ └── templates/
    │ └── login.html
    └── wtf.py
  • 效果图

    • 登录表单页面(login.html):用户可以输入用户名和密码。
    • 表单验证成功页面:当输入正确时,页面跳转到主页。
    • 错误提示页面:当输入错误时,显示错误提示信息。

  • 模板代码与Python实现

    模板代码(login.html)

    Login
    {{ form.csrf_token() }}

    {{ form.username }}

    {{ form.password }}

    {{ form.password2 }}

    {% for message in get_flashed_messages() %}

    {{ message }}

    {% endfor %}

    Python代码(wtf.py)

    from flask import Flask, render_template, request, flash
    from flask_wtf import FlaskForm
    from wtforms import StringField, PasswordField, SubmitField
    from wtforms.validators import DataRequired, EqualTo
    app = Flask(__name__)
    app.secret_key = 'Zep03'
    class LoginForm(FlaskForm):
    username = StringField(label='用户名', validators=[DataRequired()])
    password = PasswordField(label='密码', validators=[DataRequired()])
    password2 = PasswordField(label='确认密码', validators=[DataRequired(), EqualTo('password', '密码不一致')])
    submit = SubmitField('登录')
    @app.route('/login', methods=['GET', 'POST'])
    def login():
    login_form = LoginForm()
    if login_form.validate_on_submit():
    username = login_form.username.data
    password = login_form.password.data
    print(f'登录成功,用户名:{username}, 密码:{password}')
    return redirect(url_for('index'))
    return render_template('login.html', form=login_form)

    通过以上代码,开发者可以轻松创建并验证Web表单,确保数据的安全性和完整性。Flask-WTF 提供了强大的表单验证功能,支持多种验证场景,帮助开发者高效完成数据处理任务。

    上一篇:LeetCode 5687.执行乘法运算的最大分数
    下一篇:LeetCode 每日一题 1438. 绝对差不超过限制的最长连续子数组

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月11日 16时20分57秒