使用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 但这当然不是要求。根据需要修改代码。

要记住的东西:

  1. 从request:attr: ' ~flask.request创建表单。如果数据是通过HTTP ' ' POST ' '方法和:attr: ' ~flask.request提交的,则形成' value。如果数据被提交为' ' GET ' ',则args '。

  2. 要验证数据,请调用:func: ' ~wtforms.form.Form。validate ' method,如果数据验证成功,它将返回' True ',否则返回' False '。

  3. 要从窗体访问单个值,请访问 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 .