下面是详细的“Flask wtforms实现表单验证使用”的攻略:
一、前置知识
在使用 Flask wtforms 实现表单验证前,需要了解以下知识:
-
Flask:Python Web 应用框架,提供了一个模块化的方式组织 Web 应用程序。
-
Flask wtforms:基于 Flask 的表单验证扩展,可以方便地进行表单验证。
-
HTML 表单:Web 表单,包含需要提交的数据(例如文本框、下拉框、单选框等)和提交表单的方式(GET 或 POST)。
二、安装 Flask wtforms
使用 pip 安装 Flask wtforms:
pip install flask-wtf
三、实现表单验证
下面是实现 Flask 表单验证的详细步骤:
1. 创建 Flask 应用程序和表单验证代码
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
class ExampleForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired()])
submit = SubmitField('Submit')
FlaskForm
是 wtforms 扩展提供的基类,用于创建表单。在 ExampleForm
类中,定义了表单的 name
和 email
字段,以及一个提交按钮(submit
)。
其中,DataRequired
是 wtforms 提供的验证器,用于判断表单字段是否为空。
2. 创建视图函数
@app.route('/', methods=['GET', 'POST'])
def index():
form = ExampleForm()
if form.validate_on_submit():
name = form.name.data
email = form.email.data
return f'Hello {name}, your email is {email}!'
return render_template('index.html', form=form)
index
视图函数用于处理 GET 和 POST 请求。在函数中,创建了 ExampleForm
实例(form
),并且通过 if form.validate_on_submit()
判断当前请求是否是 POST 请求并且表单验证成功。
如果表单验证成功,将获取到表单字段的值并且返回一个页面,给用户一个反馈。
3. 创建模板文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Example Form</title>
</head>
<body>
<form method="POST">
{{ form.name.label }}<br>
{{ form.name }}<br>
{{ form.email.label }}<br>
{{ form.email }}<br>
{{ form.submit }}<br>
</form>
</body>
</html>
使用 HTML form
标签包含表单元素和提交按钮,并且在表单元素的前面显示标签文本。
4. 启动应用程序
if __name__ == '__main__':
app.run()
四、示例一
1. 表单验证
在表单字段上定义验证器,用于验证表单是否合法,例如:
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(min=8)])
remember_me = BooleanField('Remember Me')
submit = SubmitField('Sign In')
DataRequired
用于验证重要字段的填写情况,Length(min=8)
用于验证密码长度是否至少为8位。
2. 实现表单提交
在视图函数中实现表单提交的逻辑:
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash(f'Login requested for user {form.username.data}, remember_me={form.remember_me.data}')
return redirect('/index')
return render_template('login.html', title='Sign In', form=form)
如果表单验证通过,即可在服务器端执行登录逻辑,并重定向到某个页面。
3. 创建模板文件
创建 login.html
模板文件用于显示表单:
{% extends "base.html" %}
{% block content %}
<h1>{{ title }}</h1>
<form action="" method="post">
{{ form.hidden_tag() }}
<p>
{{ form.username.label }}<br>
{{ form.username(size=32) }}
</p>
<p>
{{ form.password.label }}<br>
{{ form.password(size=32) }}
</p>
<p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
<p>{{ form.submit() }}</p>
</form>
{% endblock %}
在模板文件中,使用 Flask wtforms 提供的 form.[fieldname]
属性获取表单字段,并且使用 HTML 标签显示表单。同时在 form.action
属性中设置表单提交的 URL。
五、示例二:使用 FieldList 显示重复的表单字段
有时候需要在表单中显示重复的表单字段,例如:
class AddressForm(FlaskForm):
street = StringField('Street', validators=[DataRequired()])
city = StringField('City', validators=[DataRequired()])
state = StringField('State', validators=[DataRequired()])
zip_code = StringField('Zip Code', validators=[DataRequired(), Length(min=5, max=10)])
可以使用 FieldList
来实现表单字段的重复,例如:
class ProfileForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
addresses = FieldList(FormField(AddressForm), min_entries=1)
submit = SubmitField('Save')
在 ProfileForm
中,使用 FormField
和 FieldList
来实现重复输入地址的功能。min_entries
可以定义用户至少需要输入的地址数量。
在视图函数中,在处理 POST 数据之前,可先根据表单提交的地址数量检测地址数量是否符合要求,例如:
@app.route('/profile', methods=['GET', 'POST'])
def profile():
form = ProfileForm()
if form.validate_on_submit():
if len(form.addresses) < 2:
flash('Please enter at least two addresses.')
return redirect('/profile')
flash('Profile updated.')
return redirect('/index')
return render_template('profile.html', title='Profile', form=form)
在模板文件中,可以使用以下代码来渲染一个 ProfileForm
表单示例:
{% extends "base.html" %}
{% block content %}
<h1>{{ title }}</h1>
<form action="" method="post">
{{ form.hidden_tag() }}
<p>
{{ form.name.label }}<br>
{{ form.name(size=32) }}
</p>
<h2>Addresses</h2>
<ul>
{% for address in form.addresses %}
<li>
{{ address.street(size=32) }}
{{ address.city(size=32) }}
{{ address.state(size=32) }}
{{ address.zip_code(size=32) }}
</li>
{% endfor %}
</ul>
<p>{{ form.submit() }}</p>
</form>
{% endblock %}
以上就是 Flask wtforms 实现表单验证的详细攻略,包括了两个示例供读者参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask wtforms实现表单验证使用 - Python技术站