网站LOGO
博客 | 棋の小站
页面加载中
12月6日
达尔达尼亚瀑布,博洛尼亚,意大利 ...
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 博客 | 棋の小站
    记录学习,心得,状态,生活。
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    使用Flask-WTF模块处理Web表单
    点击复制本页地址
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    使用Flask-WTF模块处理Web表单

    · 原创 ·
    学学编程 · FlaskPython
    共 5154 字 · 约 4 分钟 · 196

    这部分由于没有记在笔记里所以我将它放在博客里。
    因为Flask框架是一个轻量级的框架,许多拓展功能都不在最基础里的包里,因此需要安装第三方模块。处理表单及验证表单都需要下载一个叫做Flask-WTF的模块。下载它很简单,只需要使用pip install flask-wtf即可。下载完此模块后该模块的附带模块WTForms也会一并安装。

    处理CSRF

    CSRF,全称为跨站请求伪造,为了防止这种攻击,在每次表单提交时都会附带一个独一无二的token。这个token在表单被验证之前先被验证。为了生成这个token,实现对表单的保护,一般需要为程序设置一个密钥。设置密钥的语法如下:

    python 代码:
    app = Flask(__name__)
    app.config['SECERT_KEY'] = 'qi1.zone'

    app.config用于配置Flask,通过SECRET_KEY配置的密钥,对整个Flask应用以及很多拓展应用都是有效的。

    表单类

    使用Flask-WTF时,每一个表单都是由一个继承自Form的类表示,这个类定义了表单的字段,每个字段都由一个对象表示。字段对象可附属一个或多个验证函数,用来验证字段值是否符合要求。如下面的代码:

    python 代码:
    from flask_wtf import FlaskForm
    from wtforms import StringField, PasswordField, SubmitField
    from wtforms.validators import DataRequired
    
    class NameForm(FlaskForm):
        name = StringField('name', validators=[DataRequired()])
        password = PasswordField('password', validators=[DataRequired()])
        submit = Submit('提交')

    首先导入必要的包,其中FlaskForm就是Flask表单类,我们所要使用的表单需要继承自这个类;StringField等就是字段类,这个表单我们共有三个字段:姓名,密码和提交,因此我们用到了对应的三个字段对象;最后就是验证函数,WTForms已经为我们预设好了一些基础的验证函数,这里我们选择字段必填,则应该使用DataRequired。然后就是自定义一个表单类继承自FlaskForm类,然后定义其中的成员变量,这些成员变量在表单被渲染后就会编程HTML代码中的各个字段。拿第一行来说,StringField就代表这个字段是普通文本行,第一个参数代表这个字段被渲染成HTML后那个输入框的标号,第二个参数为可选参数,即验证器。WTforms还支持许多HTML标准字段,如下表所示:

    字段类型说明
    StringField文本字段
    TextAreaField多行文本字段
    PasswordField密码文本字段
    HiddenField隐藏文本字段
    DateField文本字段,值为datatime.date形式
    DateTimeField文本字段,值为datetime.datetime形式
    IntegerField文本字段,值为整数
    DecimalField文本字段,值为decimal.Decimal形式
    FloatField文本字段,值为浮点数
    BooleanField文本字段,值为True和False
    RadioField一组单选按钮
    SelectField下拉列表
    SelectMultipleField下拉列表,可选择多个值
    FileField文件上传字段
    SubmitField表单提交按钮
    FormField把表单作为字段镶嵌到另一个表单中
    FieldList一组指定类型的字段

    WTForms内置的验证函数如下表所示:

    字段类型说明
    Email验证电子邮箱地址
    EqualTo比较两个字段的值,常用于输入密码和确认密码
    IPAddress验证IPv4地址
    Length验证输入字符串的长度
    NumberRange验证输入的值在数字范围内
    Optional无输入值时跳过其他验证函数
    Required确保字段中有数据
    Regexp使用正则表达式验证输入值
    URL验证URL
    AnyOf确保输入值在可选值列表中

    HTML模板渲染方式

    Flask框架使用Jinja2渲染模板,在模板中使用{{ variable }}来输出变量,而Flask-WTF模块属于Flask框架的拓展模块,因此它也是支持使用Jinja2渲染的。在使用render_template渲染模板时,需要传入form参数,即表单,就是上方创建的表单对象。

    在模板中,使用{{ form.field.label }}展示标签,其中field是表单的字段对象,使用{{ form.field }}展示具体字段。

    下面是一个使用Flask-WTF和WTForms实现使用Flask渲染web表单的例子:

    html 代码:
    <!--模板 login.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form method="post">
        <!--首先需要加载token-->
        {{ form.csrf_token }}
        <!--左边是标签,右边是具体的字段 字段不需要加属性,Jinja2在渲染时会自动添加-->
        {{ form.user.label }}:{{ form.user() }}<br/>
        {{ form.password.label }}:{{ form.password() }}<br/>
        {{ form.submit() }}
    </form>
    </body>
    </html>
    python 代码:
    # form.py
    from flask_wtf import FlaskForm  # 表单类
    from wtforms import StringField, PasswordField, SubmitField  # 导入字段对象
    from wtforms.validators import DataRequired, Length  # 导入验证器对象
    
    
    class LoginForm(FlaskForm):  # 创建自己的表单类,继承自biao'dan'lei
        user = StringField(label='user', validators=[DataRequired('请输入用户名')])  # 实例化字段对象,第一个参数是标签,第二个参数是验证器
        password = PasswordField(label='输入密码',
                                 validators=[DataRequired('请输入密码'), Length(6, 16, '密码位数必须大于6小于16')])
        submit = SubmitField(label='登录')
    python 代码:
    #run.py
    from flask import Flask, render_template, redirect, url_for
    from form import LoginForm
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'qi1.zone'  # 密钥
    
    @app.route('/login', methods=['GET', 'POST'])  # 注意请求方式要包含POST请求
    def login():
        form = LoginForm()  # 实例化表单
        if form.validate_on_submit():  # 若表单的数据都符合验证器的要求
            user = form.user.data  # 获取数据
            password = form.password.data
            if user == 'qi' and password == '123456':  # 自己的判断条件
                return '<h1>登录成功</h1>'
            else:
                return '登录失败'
        # 同一缩进级别的if用于判断表单是否符合验证器的要求,若页面是第一次渲染则该方法返回false,就会跳到下方的代码,然后渲染模板
        return render_template('login.html', form=form)
    
    @app.route('/')
    def index():
        return redirect(url_for('login'))  # 重定向
    
    if __name__ == '__main__':
        app.run(debug=True)

    运行这段代码,浏览器输入URL,就可以看到登录页面,若账号密码均正确就会显示登录成功。同时若输入数据不符合要求则表单无法提交。

    声明:本文由 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    发一条! 发一条!
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号 ICP 冀公网安备 13030202003453号

    🕛

    本站已运行 221 天 15 小时 25 分

    👁️

    今日访问量:435 昨日访问量:2564

    🌳

    建站:Typecho 主题:MyLife
    博客 | 棋の小站. © 2023 ~ 2023.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸