flask 自定义验证器(行内验证器、全局验证器) --

自定义验证器

在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器。

行内验证器

除了使用WTForms提供的验证器来验证表单字段,我们还可以在表单类中定义方法来验证特定字段,例如:

form/form.py: 针对特定字段的验证器

from wtforms import IntegerField, submitField
from wtforms.validators import validationError

class FortyTwoForm(FlaskForm):
    answer = IntegerField('The Number')
    submit = SubmitField()
    
    def validate_answer(form, field):
        if field.data != 42:
            raise validationError('Must be 42.')

 

 

当表单类中包含以“validate_字段属性名”形式命名的方法时,在验证字段数据时会同时调用这个方法来验证对应的字段,因为这一点,表单类的字段名不能以validate开头。验证方法接受两个位置参数,一次为form和field,前者为表单类实例,后者是字段对象,我们可以通过field.data获取字段数据,这两个参数将在验证表单时被调用传入。验证出错时抛出从wtforms.validators模块导入的ValidationError异常,传入错误消息作为参数。因为这种方法仅用来验证特定的表单类实例,所以又称为行内验证器。

 

定义视图函数:

@app.route('/basic_macro',methods=['GET','POST'])
def basic_macro():
    form = FortyTwoForm()
    if form.validate_on_submit():
        return redirect(url_for('hello'))
    return render_template('basic_macro.html', form=form)

 

 

basic_macro.html中修改渲染字段:

 

<form method="post">
    {{ form.csrf_token }}
    {{ form_field(form.answer) }}<br>
    {{ form.submit }}<br>
</form>

 

访问127.0.0.1:5000/basic_macro

提交空格:

 

 

如果把自定义验证器函数注释掉,则验证时显示如下,没有额外的提示

 

 

 

全局验证器

如果想要创建一个可重用的通用验证器,可以通过定义一个函数来实现。如果不需要传入参数定义验证器,那么一个和表单类中定义的验证方法完全相同的函数就足够了,例如:

 

在app.py中定义一个is_41()验证器函数,在FortyOneForm表单类中定义字段时传入这个验证器,在提交表单时会调用这个验证器进行调用
 
 
from wtforms import IntegerField, SubmitField
from wtforms.validators import ValidationError

def is_41(form, field):
    if field.data != 41:
        raise ValidationError('Must be 41')

class FortyOneForm(FlaskForm):
    answer = IntegerField('The Number', validators=[is_41])
    submit = SubmitField()

 

当使用函数定义全局的验证器时,我们需要在定义字段时在validators列表里传入这个验证器。因为在validators列表中传入的验证器必须是可调用对象,所以这里传入了函数对象,而不是函数调用。

 

在实际应用时,通常需要让验证器支持传入传参数来对验证过程进行设置。

至少应该支持message参数来设置自定义错误消息。这时验证函数应该实现成工厂函数,即返回一个可调用对象的函数,比如:

 

工厂函数形式的全局验证器:

from wtforms import IntegerField, SubmitField
from wtforms.validators import ValidationError

def is_41(message=None):
    if message is None:
        message = 'Must be 41.'
    def _is_41(form, field):
        if field.data != 41:
            raise ValidationError(message)
    return _is_41

class FortyOneForm(FlaskForm):
    answer = IntegerField('The Number', validators=[is_41()])
    submit = SubmitField()
 
 

在现在的is_41()函数中,我们创建了另一个_is_41()函数,这个函数胡作为被调用对象返回。is_41()函数接收的message参数用来传入自定义错误消息,默认为None,如果没有设置就使用内置消息。在validators列表中,这时要传入的是对工厂函数is_41()的调用。

 

用默认的参数时,访问/basic_macro路径:

 

在is_41()函数中传入参数,再次访问,页面提示内容就会显示传入的内容:

 

class FortyOneForm(FlaskForm):
    answer = IntegerField('The Number', validators=[is_41("Wrong input, it should be 41")])
    submit = SubmitField()

 

转载于:https://www.cnblogs.com/xiaxiaoxu/p/10549448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值