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

Flask 使用WTForms进行表单验证

程序员文章站 2022-03-08 22:55:28
...

**表单验证当您必须处理由浏览器视图提交的表单数据时,代码很快就会变得非常难以阅读。**有一些库是为了使这个过程更容易管理而设计的。其中之一是我们将在这里处理的WTForms。如果你发现自己的情况有很多形式,你可能想尝试一下。
当您使用WTForms时,您必须首先将表单定义为类。我建议将应用程序拆分为多个模块(更大的应用程序),并为表单添加一个单独的模块。与WTForms

当您使用WTForms时,您必须首先将表单定义为类。我建议将应用程序拆分为多个模块(更大的应用程序),并为表单添加一个单独的模块。

表单

一个典型的表单注册例子:

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)

注意,我们暗示视图在这里使用SQLAlchemy(在Flask中是SQLAlchemy),但这当然不是必需的。根据需要修改代码。

事情要记住:

  1. 如果数据是通过HTTP POST方法提交的,则从请求表单值创建表单;如果数据是作为GET提交的,则从args创建表单。
  2. 要验证数据,请调用validate()方法,如果数据验证,该方法将返回True,否则返回False。
  3. 若要从表单访问单个值,请访问表单..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)。**将一个类添加到输入元素中。注意,WTForms返回标准的Python unicode字符串,因此我们必须告诉Jinja2,该数据已经使用|安全过滤器进行了html转义。

下面是我们上面使用的函数的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>
相关标签: flask form