FLASK表单验证

本文介绍了如何在FLASK应用中使用WTForms进行表单验证,包括导入必要的模块,定义表单类,设置验证规则,以及常见的验证函数如Length、EqualTo等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,

WTForms的作用主要有两点:1、验证表单;2、渲染模板

一、首先我们从wtfroms库中导入Form、StringField(用户验证input字段类型)代码如下:from wtforms import Form,StringField

二、当您使用WTForms时,要将表单定义为类,创建一个表单验证类,传入参数Form(不传参数是一个普通类):

class RegistForm(Form):
    pass

三、接着从wtforms.validator中导入Length,EqualTo(验证用户输入字符长度及密码与确认密码是否一致),代码如下:

from swtforms.validator import Length,EqualTo

四、在该类中定义需要验证的字段及相应的验证条件。注意:name、password、repeat_pwd需与input中name保持一致!代码如下:

class RegistForm(Form):
    name = StringField(validators=[Length(max=6,min=3)])
    password = StringField(validators=[Length(max=10,min=3)])
    repeat_pwd = StringField(validators=[Length(max=10,min=3),EqualTo("password")])

五、异常输出方法:在验证器中定义message参数,代码如下所示:

class RegistForm(Form):
    name = StringField(validators=[Length(max=6,min=3)])
    password = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10")])
    repeat_pwd = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10"),EqualTo("password")])

六、字段定义  字段以声明方式定义为表单上的成员:

class MyForm(Form):
    name    = StringField(u'Full Name', [validators.required(), validators.length(max=10)])
    address = TextAreaField(u'Mailing Address', [validators.optional(), validators.length(max=200)])
七、基本字段
class wtforms.fields.BooleanField   复选框,值为true和false
class wtforms.fields.DateField      文本字段,值为datatime.date格式
class wtforms.fields.DateTimeField   文本字段,值为datetime.datetime格式
class wtforms.fields.DecimalField   文本字段,值为decimal.Decimal
class wtforms.fields.FileField    文本上传字段
class wtforms.fields.MultipleFileField
class wtforms.fields.FloatField    文本字段,值为浮点数
class wtforms.fields.IntegerField   文本字段,值为整数
class wtforms.fields.RadioField    一组单选框
class wtforms.fields.SelectField    下拉列表
class wtforms.fields.SelectMultipleField   下拉列表,可选择多个值
class wtforms.fields.StringField   文本字段

八、Validators

验证器只需输入一个输入,验证它是否知足某些标准,例如字符串的最大长度并返回。或者,若是验证失败,则引起a ValidationError。该系统很是简单灵活,容许您在字段上连接任意数量的验证器。

常用验证函数: DataRequired  确保字段中有数据     EqualTo  比较两个字段的值,常用于比较两次密码输入   Length 验证输入的字符串长度  Email 验证电子邮件

                          NumberRange 验证输入的值在数字范围内   URL 验证url   AnyOf 验证输入值在可选列表中  NoneOf 验证输入值不在列表中

九、用户注册实例
from flask import Blueprint,render_template,request
from wtforms.fields import simple
from wtforms.fields import html5
from flask_wtf import FlaskForm
from wtforms.fields import core
from wtforms import StringField
from wtforms import widgets,validators

class MyForm(FlaskForm):
# == == == == == == == == == == == =simple == == == == == == == == == == == == == =
    name = StringField(
        label='姓名:',
        validators=[validators.DataRequired()],
        widget=widgets.TextInput(),
        render_kw={"class": "form-control"},  # 添加一些样式,用于Bootstrap
    )

    pwd = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="密码不能为空")
        ]
    )

    pwd_confim = simple.PasswordField(
        label="重复密码",
        validators=[
            validators.DataRequired(message='重复密码不能为空.'),
            validators.EqualTo('pwd', message="两次密码不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )
#========================html5============================
    email = html5.EmailField(  # 注意这里用的是html5.EmailField
        label='邮箱',
        validators=[
            validators.DataRequired(message='邮箱不能为空.'),
            validators.Email(message='邮箱格式错误')
        ],
        widget=widgets.TextInput(input_type='email'),
        render_kw={'class': 'form-control'}
    )

#===================如下是用core来调用的=======================
    gender = core.RadioField(
            label="性别",
            choices=(
                (1,"男"),
                (1,"女"),
            ),
            coerce=int  #限制是int类型的
        )
    city = core.SelectField(
            label="城市",
            choices=(
                ("bj","北京"),
                ("sh","上海"),
            )
        )
    hobby = core.SelectMultipleField(
        label='爱好',
        choices=(
            (1, '篮球'),
            (2, '足球'),
        ),
        coerce=int
    )
    favor = core.SelectMultipleField(
        label="喜爱",
        choices=(
            (1, '篮球'),
            (2, '足球'),
        ),
        widget = widgets.ListWidget(prefix_label=False),
        option_widget = widgets.CheckboxInput(),
        coerce = int,
        default = [1, 2]
    )


    def __init__(self, *args, **kwargs):  # 这里的self是一个RegisterForm对象
        '''重写__init__方法'''
        super(MyForm, self).__init__(*args, **kwargs)  # 继承父类的init方法
        self.favor.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))  # 吧RegisterForm这个类里面的favor从新赋值
        # 方法验证
        def validate_pwd_confim(self, field, ):
            '''
            自定义pwd_config字段规则,例:与pwd字段是否一致
            :param field:
            :return:
            '''
            # 最开始初始化时,self.data中已经有全部的值
            if field.data != self.data['pwd']:
                # raise validators.ValidationError("密码不一致") # 继续后续验证
                raise validators.StopValidation("密码不一致")  # 再也不继续后续验证


register = Blueprint("register",__name__)

@register.route("/regist",methods=["GET","POST"])
def regist():
    if request.method == "GET":
        form = MyForm()
        return render_template("regis.html",forms = form)


    form = MyForm(formdata=request.form)
    if form.validate(): #验证是否成功
        print("数据校验经过")
    else:
        return render_template("regis.html",forms = form)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>


<form action="" method="post">
{#    {{ form.name.label }}#}
{#    {{ form.name }}#}
{#    {{ form.name.errors.0 }}#}
    {% for form in forms %}
        <p>
            {% if form.label.text == "CSRF Token" %}

            {% else %}
                {{ form.label }}
                {{ form }}
                <span style="color: red;">{{ form.errors.0 }}</span>

            {% endif %}


        </p>
    {% endfor %}

    <input type="submit" value="提交">

</form>

</body>
</html>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值