flask-WTF的使用

宰鸿博
2023-12-01

Flask-WTF(http://pythonhosted.org/Flask-WTF) 扩展可以把处理表单的过程变成一种愉悦的体验。这个扩展对独立的WTForms(http://wtforms.simplecodes.com)包进行了包装,方便集成到Flask程序中。

  1. 说明:是一个关于表单的扩展库,可以自动生成表单的HTML代码和验证提交的表单数据,并且提供跨站请求伪造(Cross-Site Request Forgery)保护的功能,使用非常方便。

  2. 安装:pip install flask-wtf

  3. 使用:

    1. 定义表单类

    # 设置秘钥
    app.config['SECRET_KEY'] = '123456'
    ​
    # 导入表单基类
    from flask_wtf import FlaskForm
    # 导入相关字段
    from wtforms import StringField, SubmitField
    # 导入相关验证器类
    from wtforms.validators import DataRequired
    ​
    class NameForm(FlaskForm):
        name = StringField('用户名', validators=[DataRequired()])
        submit = SubmitField('提交')
    1. 添加视图函数

    @app.route('/')
    def index():
        # 创建表单对象
        form = NameForm()
        # 渲染时分配到模板文件
        return render_template('form.html', form=form)
    1. 表单渲染

    {# 原生渲染 #}
    {# 判断是否有错误#}
    {% if form.name.errors %}
        {{ form.name.errors[0] }}
    {% endif %}
    <h1>Hello {{ name }}</h1>
    <form action="{{ url_for('wtform') }}" method="post" >
        # {{form.hidden_tag()}}里面放的也就是csrf_token
        {{ form.csrf_token }}
        {{ form.name.label() }}{{ form.name(id='xx',class='yyy') }}
        {{ form.submit() }}
    </form>
    ​
    {# bootstrap渲染 #}
    {% extends 'bootstrap/base.html' %}
    {% import 'bootstrap/wtf.html' as wtf %}
    {% block content %}
        <div class="container">{{ wtf.quick_form(form) }}</div>
    {% endblock %}
    1. 表单校验

    @app.route('/', methods=['GET', 'POST'])
    def index():
        # 创建表单对象
        form = NameForm()
        name = None
        # 表单校验
        if form.validate_on_submit():
            # 通过校验,则取出数据
            name = form.name.data
            form.name.data = ''
        # 渲染时分配到模板文件
        return render_template('form.html', form=form, name=name)
    1. POST重定向GET解决重复提交的问题

    @app.route('/wtform/', methods=['GET','POST'])
    def wtform():
        form = MyForm()
        # 判断form表单中的数据是否通过校验
        if form.validate_on_submit():
            # 通过校验,则取出数据。
            name = form.name.data
            last_name = session.get('name') or None
            # 判断这次提交的name是否和上次的相等
            if last_name and last_name == name:
                return '老铁别重复提交了'
            else:
                # 不是重复提交,设置session
                session['name'] =  name
                return render_template('wtform.html',form=form, name=name)
        return render_template('wtform.html', form=form)
  4. 常见字段类型

    字段类型说明
    StringField普通文本字段
    PasswordField密码文本字段
    SubmitField提交按钮
    HiddenField隐藏文本字段
    TextAreaField多行文本字段
    DateField文本字段,datetime.date格式
    DateTimeField文本字段,datetime.datetime格式
    IntegerField文本字段,整数类型
    FloatField文本字段,小数类型
    BooleanField复选框,值为True或False
    RadioField单选框
    SelectField下拉列表
    FileField文件上传字段
  5. 常见验证器类

    验证器说明
    DataRequired确保字段有值(并且if判断为真)
    Email邮箱地址
    IPAddressIPv4的IP地址
    Length规定字符长度
    NumberRange输入数值的范围
    EqualTo验证两个字段的一致性
    URL有效的URL
    Regexp正则验证

    自定义字段验证:就是写一个'validate_字段'的函数,如下:

    class NameForm(FlaskForm):
        name = StringField('用户名', validators=[DataRequired()])
        submit = SubmitField('提交')
    ​
        # 自定义字段验证
        def validate_name(self, field):
           if len(field.data) < 6:
               raise ValidationError('用户名长度不能少于6个字符')



 类似资料: