使用wtforms验证表单¶
当您必须处理由浏览器视图提交的表单数据时,代码很快就会变得非常难以读取。那里有一些库设计用来使这个过程更容易管理。其中之一是 WTForms 我们在这里处理。如果你发现自己处于多种形式的情况下,你可能想尝试一下。
使用wtforms时,必须首先将表单定义为类。我建议将应用程序分解为多个模块 (大型应用程序包 )并为表单添加单独的模块。
使用扩展名充分利用wtforms
`Flask-WTF`_扩展扩展了这种模式,增加了一些小助手,使表单和Flask更有趣。 你可以从`PyPI <https://pypi.org/project/Flask-WTF/>`_获得它。
形式¶
这是典型注册页的示例表单:
from wtforms import Form, BooleanField, StringField, PasswordField, validators
class RegistrationForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
password = PasswordField('New Password', [
validators.DataRequired(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])
在视野中¶
在View函数中,此表单的用法如下:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
user = User(form.username.data, form.email.data,
form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
注意,我们暗示视图正在使用sqlacalchemy (Flask的SQLAlchemy 但这当然不是要求。根据需要修改代码。
要记住的东西:
从request:attr: ' ~flask.request创建表单。如果数据是通过HTTP ' ' POST ' '方法和:attr: ' ~flask.request提交的,则形成' value。如果数据被提交为' ' GET ' ',则args '。
要验证数据,请调用:func: ' ~wtforms.form.Form。validate ' method,如果数据验证成功,它将返回' True ',否则返回' False '。
要从窗体访问单个值,请访问 form.<NAME>.data.
模板中的表单¶
现在到模板端。当您将表单传递给模板时,您可以轻松地在那里呈现它们。查看下面的示例模板,看看这有多简单。wtforms已经为我们生成了一半的表单。为了使它更好,我们可以编写一个宏来呈现带有标签的字段和错误列表(如果有)。
下面是一个例子 _formhelpers.html
具有此类宏的模板:
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
此宏接受几个转发到wtform的field函数的关键字参数,这些参数为我们呈现字段。关键字参数将作为HTML属性插入。例如,你可以打电话给 render_field(form.username, class='username')
向输入元素添加类。注意,WTForms返回标准的Python字符串,所以我们必须告诉Jinja2,这个数据已经用 |safe
过滤器。
这里是 register.html
我们上面使用的函数模板,它利用了 _formhelpers.html
模板:
{% from "_formhelpers.html" import render_field %}
<form method=post>
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
有关wtforms的更多信息,请访问 WTForms website .