Flask WTForms 表单插件的使用

这篇具有很好参考价值的文章主要介绍了Flask WTForms 表单插件的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Web应用中,表单处理是一个基本而常见的任务。Python的WTForms库通过提供表单的结构、验证和渲染等功能,简化了表单的处理流程。与此同时,Flask的扩展Flask-WTF更进一步地整合了WTForms,为开发者提供了更便捷、灵活的表单处理方式。Flask-WTF是建立在WTForms之上的Flask扩展,旨在简化Web应用中表单处理的流程。它提供了与Flask框架的无缝集成,使得表单的创建、验证和渲染变得非常容易。通过Flask-WTF,开发者能够轻松地构建具有强大功能和良好用户体验的表单页面。

主要特点:

  1. 结合WTForms功能: Flask-WTF基于WTForms库,继承了WTForms的强大功能,包括表单字段、验证器等,为开发者提供了一套完备的表单处理工具。
  2. Flask集成: 与Flask框架无缝集成,通过简单的导入和初始化,即可在Flask应用中使用Flask-WTF提供的表单处理功能。
  3. CSRF保护: Flask-WTF内置了CSRF(Cross-Site Request Forgery)保护机制,帮助开发者防范Web应用中的CSRF攻击。
  4. 表单渲染: 提供了方便的表单渲染方法,使得表单的呈现过程更为简单,开发者可以轻松定制表单的外观。
  5. 文件上传支持: 支持文件上传功能,使得开发者能够方便地处理包含文件上传功能的表单。

通过Flask-WTF,开发者能够以更高效的方式处理Web应用中的表单,减少重复性工作,提升开发效率。

简单验证表单

前台定义渲染模板,后端对模板渲染,并根据validators验证器中的规则对输入内容进行匹配。

<form method="post">
  {{ form.csrf_token }}
  <!--可自定义增加颜色-->
  <p>{{ form.username.label(style="color:red;") }} : {{form.username}}</p>
  <p>{{ form.password.label }} : {{form.password}}</p>
  <p>{{ form.repeat_password.label }} : {{form.repeat_password}}</p>

  {% for msg in form.repeat_password.errors %}
    <p>提示: {{msg}}</p>
  {% endfor %}

  {{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexp

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):
    # DataRequired 验证不为空,Length 限制长度, Regexp限制不允许出现弱口令
    username = StringField(label=u"登录账号", validators=[DataRequired(), Length(min=6, max=18)])
    password = PasswordField(label=u"登录密码", validators=[DataRequired(), Length(min=6, max=18)])
    repeat_password = PasswordField(label=u"确认密码", validators=[DataRequired(),EqualTo("password", u"两次密码不一致")])
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            username = form.username.data
            password = form.password.data
            repeat_password = form.repeat_password.data

            print("用户名: {} --> 密码: {}".format(username,repeat_password))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

运行后默认构造一个账号密码登录窗口的表单,用户可以填写表单并返回给后台信息,如下图所示;

Flask WTForms 表单插件的使用

表单附加参数

所谓附加参数就是指,渲染器返回页面是主动对某个组件增加一些CSS属性,这些属性起到装饰作用,通常会使用render_kw属性返回CSS。

{% for msg in get_flashed_messages() %}
    <p>闪现消息: {{ msg }}</p>
{% endfor %}

<form method="POST" id="form-data">
    {{ form.csrf_token }}
    {{ form.username.label }} : {{ form.username }}
    {{ form.password.label }} : {{ form.password }}
    {{ form.submit.label }} {{ form.submit }}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request,flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexp

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):
    username = StringField(
        # 标签
        label="账号",
        # 验证器
        validators=[
            DataRequired('请输入用户名')
        ],
        description="账号",
        # 增加附加参数
        render_kw={
            "class":"form-control",
            "placeholder":"请输入用户名",
            "required":'required'
        }
    )

    password = PasswordField(
        label="密码",
        validators=[
            DataRequired('请输入登录密码')
        ],
        description="密码",
        render_kw={
            "class": "form-control",
            "placeholder": "请输入登录密码",
            "required": 'required'
        }
    )
    submit = SubmitField(
        label="登录",
        render_kw={
            "class": "btn",
        }
    )

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            username = form.username.data
            password = form.password.data
            print("用户名: {} 密码: {}".format(username, password))

            if username == "lyshark" and password == "123123":
                flash("密码正确")
            else:
                flash("密码错误")

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

运行上述代码,当用户输入密码错误后会出现闪现消息,如下图所示;

Flask WTForms 表单插件的使用

地址验证表单

Flask框架中特殊表单的验证有很多,常用的表单验证也就以下这几种。

<form method="post">
  {{ form.csrf_token }}

  <p>{{ form.url.label }} : {{form.url}}</p>
    <p>{{ form.address_v4.label }} : {{form.address_v4}}</p>
    <p>{{ form.address_v6.label }} : {{form.address_v6}}</p>
    <p>{{ form.mac.label }} : {{form.mac}}</p>
  {{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm

from wtforms import (BooleanField, DecimalField, DateField, DateTimeField, FieldList,
 FloatField, FormField, IntegerField, RadioField, SelectField,
 SelectMultipleField, StringField,SubmitField,PasswordField)

from wtforms.validators import (DataRequired, data_required, Email, email, EqualTo, equal_to,
    IPAddress, ip_address, InputRequired, input_required, Length,
    length, NumberRange, number_range, Optional, optional,
    Regexp, regexp, URL, url, AnyOf,
    any_of, NoneOf, none_of, MacAddress, mac_address, UUID)

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):
    url = StringField(label=u"验证网址", validators=[DataRequired(), Length(min=6, max=30),URL()])
    address_v4 = StringField(label=u"验证IPv4", validators=[DataRequired(), Length(max=30), IPAddress()])
    address_v6 = StringField(label=u"验证IPv6", validators=[DataRequired(), Length(max=30), IPAddress(ipv6=True)])
    mac = StringField(label=u"验证MAC地址",validators=[DataRequired(), Length(max=60), MacAddress()])
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            url = form.url.data
            address_v4 = form.address_v4.data
            address_v6 = form.address_v6.data
            mac = form.mac.data

            print("网址: {} 地址v4: {} 地址v6: {} MAC地址: {}".format(url,address_v4,address_v6,mac))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

网络IP地址的验证也有相应的表单,如下表单分别可以实现对不同地址的验证;

Flask WTForms 表单插件的使用

特殊表单验证

WTF表单除去常规表单验证以外,还可以验证其他特殊表单,例如验证邮箱,浮点数,日期时间等。

<form method="post">
    {{ form.csrf_token }}

    <!--邮箱-->
    <p>{{ form.email.label }} --> {{ form.email }}</p>
    {% for msg in form.email.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--年龄-->
    <p>{{ form.age.label }} --> {{ form.age }}</p>
    {% for msg in form.age.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--小数-->
    <p>{{ form.height.label }} --> {{ form.height }}</p>
    {% for msg in form.height.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--浮点数-->
    <p>{{ form.float_.label }} --> {{ form.float_ }}</p>
    {% for msg in form.float_.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--段落-->
    <p>{{ form.description.label }} --> {{ form.description }}</p>
    {% for msg in form.description.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--日期-->
    <p>{{ form.local_date.label }} --> {{ form.local_date }}</p>
    {% for msg in form.local_date.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--时间-->
    <p>{{ form.time_date.label }} --> {{ form.time_date }}</p>
    {% for msg in form.time_date.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--日期时间-->
    <p>{{ form.datetime_date.label }} --> {{ form.datetime_date }}</p>
    {% for msg in form.datetime_date.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    {{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,
                            SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,
                            RadioField, IntegerField, DecimalField, SubmitField,
                            IntegerRangeField)

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):
    # 安装 pip install email-validator
    email = StringField(label=u"邮箱地址", validators=[Email(message=u"邮箱格式错误"),Length(max=32)])

    # 整数类型输入,必须输入整型数值,范围在16到70之间
    age = IntegerField(label=u"年龄", validators=[NumberRange(min=16, max=70)])

    # 小数类型输入,必须输入数字数值,显示时保留两位小数
    height = DecimalField(label=u"小数输入", places=2)

    # 浮点数类型输入,必须输入浮点数值
    float_ = FloatField(label=u"浮点数输入")

    # Text Area类型 段落输入框
    description = TextAreaField(label=u"段落输入")

    # 日期类型输入,必须输入是 "年-月-日" 格式的日期
    local_date = DateField(label=u"日期", format='%Y-%m-%d')

    # 时间类型输入,必须输入是 "时:分:秒" 格式
    time_date = TimeField(label=u"时间", format='%H:%M')

    # 日期时间类型,必须输入是 "年-月-日 时:分:秒" 格式
    datetime_date = DateTimeField(label=u"日期时间", format='%Y-%m-%d %H:%M:%S')
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            email = form.email.data
            age = form.age.data
            height = form.height.data
            float_ = form.float_.data
            description = form.description.data
            print("邮箱: {} 年龄: {} 小数点: {} 浮点数: {} 段落输入: {}".format(email,age,height,float_,description))

            local_date = form.local_date.data
            time_date = form.time_date.data
            datetime_date = form.datetime_date.data
            print("日期: {} 时间: {} 日期时间: {}".format(local_date,time_date,datetime_date))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

特殊表单的构建,这里的表单包括了如下图所示的字段可以使用;

Flask WTForms 表单插件的使用

复选多选表单

复选框多选框与下拉选择框三种表单的验证方式总结。

<form method="post">
    {{ form.csrf_token }}

    <!--单选框过滤器-->
    <p>{{ form.gender.label }} {{ form.gender }}</p>
    {% for msg in form.gender.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--下拉框过滤器-->
    <p>{{ form.jobs.label }} {{ form.jobs }}</p>
    {% for msg in form.jobs.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--多选框过滤器-->
    <p>{{ form.hobby.label }} {{ form.hobby }}</p>
    {% for msg in form.hobby.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--单选框过滤器-->
    <p>{{ form.accept.label }} {{ form.accept }}</p>
    {% for msg in form.accept.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    <!--复选框过滤器-->
    <p>{{ form.favor.label }} {{ form.favor }}</p>
    {% for msg in form.favor.errors %}
        <p>错误提示: {{msg}}</p>
    {% endfor %}

    {{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import Form,widgets,validators
from wtforms.fields import simple,core
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,
                            SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,
                            RadioField, IntegerField, DecimalField, SubmitField,
                            IntegerRangeField)

from wtforms.fields import simple,core

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):

    # RadioBox单选框,choices里的内容会在ul标签里,里面每个项是(值,显示名)对
    gender = RadioField(label=u"性别", choices=[('man', '男'), ('wo', '女')], validators=[DataRequired()])

    # Select下拉单选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
    jobs = SelectField(label=u"工作", choices=[("teacher","老师"),("doctor","医生"),("engineer","工程师")])

    # Select多选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
    hobby = SelectMultipleField(label=u"兴趣", choices=[('swim', '渗透'),('skate', '运维'),('hike', '科学')])

    # Checkbox单选框 加上default='checked' 即默认是选上的
    accept = BooleanField(label=u"单选框", default='checked', validators=[DataRequired()])

    # Select复选框, 多选框合并选择,复选框
    favor = SelectMultipleField(
        label="特长",
        choices=((1, 'Python'), (2, '渗透'), (3, "运维"), (4, "科学")),
        coerce=int, default=[1, 2, 4],
        option_widget=widgets.CheckboxInput(),
        widget=widgets.ListWidget(prefix_label=False)
    )

    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            gender = form.gender.data
            jobs = form.jobs.data
            hobby = form.hobby.data
            accept = form.accept.data
            favor = form.favor.data

            print("性别: {} 工作: {} 兴趣: {} 是否接受: {} 复选框: {}".format(gender,jobs,hobby,accept,favor))


            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

选择菜单包括了单选与多选,如下图所示的表单均可以构建;

Flask WTForms 表单插件的使用

文件上传表单

文件上传Flask也提供了默认表单可以使用,如下提供的FileField即可完成上传工作。

<form method="POST" action="" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    {{ form.attach.label }} {{ form.attach }}
    <input type="submit" value="Submit">
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from werkzeug.utils import secure_filename
from flask_wtf.file import FileField, FileAllowed, FileRequired

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定义表单模型类
class MyFlaskForm(FlaskForm):
    attach = FileField(label="上传文件",validators=[
        FileRequired(),
        FileAllowed(["jpg","png"],"只可上传图片")
    ])

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            filename = secure_filename(form.attach.data.filename)
            form.attach.data.save('/' + filename)
            return 'Upload successfully!'


            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

if __name__ == '__main__':
    app.run(debug=True)

上传表单时需要注意,启动的进程必须具备管理员权限或者是读写权限,否则则会提示权限拒绝;

Flask WTForms 表单插件的使用文章来源地址https://www.toymoban.com/news/detail-747437.html

到了这里,关于Flask WTForms 表单插件的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flask不使用flask-login插件

    由于flask版本升级问题,flask-manager里面的Command命令高版本不支持,低版本的兼容flask-sqlalchemy启动也会报错,第三方插件有很多问题,所以痛定思痛决定放弃使用这个,使用flask自带语法自己写一个 类似于django继承django.contrib.auth.User一样 request.user全局一样,可以获取到用户信

    2024年01月18日
    浏览(43)
  • 如何使用PHP Smarty处理表单数据

    这里是一个超级有用的工具,可以帮助你轻松地处理表单数据。它不仅让你的代码看起来更美观,还让你的工作变得更轻松。 首先,你需要安装Smarty。你可以通过下载Smarty库并将其解压到你的项目中来完成这一步。然后,你需要创建一个Smarty对象,并将其与你的PHP代码结合使

    2024年02月13日
    浏览(51)
  • Flask狼书笔记 | 04_表单

    表单是和用户交互最常见的方式之一,本章涉及的Python包由 WTForms 、 Flask-WTF 、 Flask-CKEditor 。(p104) 通过 form 标签创建表单, input 标签创建字段。 WTForms :支持在Python中使用类定义表单,然后通过类定义生成对应的HTML代码。 Flask-WTF在Flask中集成了表单数据解析、CSRF保护、

    2024年02月11日
    浏览(34)
  • Layui + Flask | 表单组件(组件篇)(07)

    http://layui.dev/docs/2.8/form 表单组件 form 是包含输入框、选择框、复选框、开关、单选框等表单项组件的集合,主要用于对表单域进行各类动态化渲染和相关的交互操作。form是 Layui 最常用的组件之一。 form 组件自身的普通布局。其要点为: 通过  class=\\\"layui-form\\\"  定义一个表单域

    2024年02月09日
    浏览(38)
  • Layui + Flask | 表单元素(组件篇)(06)

    表单元素是输入框、选择框、复选框、开关、单选框等表单项组件,用于对表单域进行输入。layui 的表单元素对原生的表单元素进行了大幅的用着,有好看的 UI 同时又有非常方便操作的 API。 https://layui.dev/docs/2.8/form/input.html 输入框组件是对文本框  input type=\\\"text\\\"  和多行文本

    2024年02月09日
    浏览(36)
  • 如何使用Python和正则表达式处理XML表单数据

    在日常的Web开发中,处理表单数据是一个常见的任务。而XML是一种常用的数据格式,用于在不同的系统之间传递和存储数据。本文通过阐述一个技术问题并给出解答的方式,介绍如何使用Python和正则表达式处理XML表单数据。我们将探讨整体设计、编写思路和一个完整的案例,

    2024年02月10日
    浏览(68)
  • 使用Flask高效构建Web应用

    1、聊聊Flask框架 Flask官方文档   Flask是Armin ronacher 基于Python开发的微型Web框架 ,诞生于2010年,它 依赖于jinja2模板和Werkzeug WSGI服务 。Flask的 核心简单易于扩展 ,它不会替你做出太多决策比如使用何种数据库或模板引擎,这些都可以根据自己的需求进行选择和替换。Flask的

    2024年02月08日
    浏览(69)
  • 使用flask开启一个简单的应用

    Flask是非常流行的 Python Web框架,它能如此流行,原因主要有如下几点: 。有非常齐全的官方文档,上手非常方便。 。有非常好的扩展机制和第三方扩展环境,.工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易。 。社区活跃度非常高。 。微框架的形式给开发者

    2024年02月16日
    浏览(45)
  • Django Form实现表单使用及应用场景

    首先需要定义一个使用场景: 音乐网站的前端部分可以添加上传歌手的单曲, 这个添加页面就使用django form表单来实现。 目录 数据表内容 歌手表及表模型 单曲表及表模型 演示表单使用 设置路由 创建form.py 视图实例化表单类 模板使用表单对象 表单使用进阶 优化表单类 视

    2024年02月09日
    浏览(40)
  • 9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用

    common/base.html shop2.html Tornado中支持累死Vue中的组件功能,就是也公共的内容提取出来当成组件。 具体的使用方式是用 tornado.web.UIModule 环境搭建 在网站中,少了数据CRUD的操作,但在tornado中,我们知道若想操作的话尽量使用异步的操作,这样效率才会高。 那应该如何编写呢,

    2024年02月04日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包