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()

flask 自定义验证器(行内验证器、全局验证器)的更多相关文章
- 微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇
一.独立验证器 我上篇中我将AndCompositeValidator和OrCompositeValidator归为独立验证器,这2个验证器主要是为了第一类验证服务,可以进行多种验证组合在一起进行复杂 ...
- 两步验证杀手锏:Java 接入 Google 身份验证器实战
两步验证 大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见不鲜,所以苹果都建议大家开启两步验证的. Google 的身份验证器一般也是用于登 ...
- vxe-table 可编辑表格 行内编辑以及验证 element-UI集成
<vxe-table border show-overflow ref="xTable" ----------------------------------------- ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- Python学习【第5篇】:Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器、模块)
一.为什么要使用函数? 1.避免代码重用 2.提高代码的可读性 二.函数的定义与调用 1. def 函数名(参数1,参数2): ''' 函数注释''' print('函数体') return 返回值 ...
- [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Flask基础(16)-->WTForms表单创建和简单验证
Flask基础(16)-->WTForms表单创建和简单验证 前言:使用Flask_WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨站请求伪造)保护.SECRET ...
- atittit.表单验证的实现方式以及原理本质以及选型以及自定义兼容easyui dsl规则的表单验证
atittit.表单验证的实现方式以及原理本质以及选型以及自定义兼容easyui dsl规则的表单验证 1. 需求,表单验证需要弹框式,但目前easyui ms绑定死了tooltip式样 1 2. 表 ...
随机推荐
- 对web标准化(或网站重构)知道哪些相关的知识,简述几条你知道的Web标准?
网页主要有三部分组成:结构(Structrue).表现(Presentation)和行为(Behavior).对应的网站标准也分为三方面: 1.结构化标准语言,主要包括XHTML和XML: 2.表现标 ...
- MongoDB pymongo模块
安装pymongo模块 pip install pymongo 连接mongodb代码,生成pymongo对象,传入连接服务器相关参数 ip 端口 如果使用指定的账户登录,设置要登录的账户和密码,然后 ...
- redis缓存和mysql数据库同步
附redis关于缓存雪崩和缓存穿透,热点key 穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法: 持久层查询不到就缓存空结果,查询时先判断缓存 ...
- 用laravel dingo/api创建产品api
沿着上一篇来讲,我们来创建一个简单的item产品api,也是用到laravel dingo/api来实现,对dingo/api不熟的朋友可以翻看前面的文章.好,我们随着ytkah一起来创建产品api ...
- Java中Collections类的排序sort函数两种用法
java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1. 自然排序(natural ordering). 函数原型:sort(List< ...
- 微信小程序--修改data数组或对象里面的值
1.初始data数据 Page({ data:{ code:'1234', reward:[{ name:"艾伦" ...
- Python 命名笔记
类名开头大写,驼峰命名 函数名,变量名都小写, 全局常量 如COUNT, 使用全部大写 https://www.cnblogs.com/lytwajue/p/7324724.html 这个是全局变量关 ...
- 前端的icon处理
http://fontawesome.io/ 发现CSS也可以生成icon
- Maven中的-D(Properties属性)和-P(Profiles配置文件)
-D代表(Properties属性) 使用命令行设置属性-D的正确方法是: mvn -DpropertyName=propertyValue clean package 如果propertyName不 ...
- Kotlin 型变 + 星号投影(扯蛋)
Kotlin中的型变: 1. in,顾名思义,就是只能作为传入参数的参数类型 2.out, ..............,就是只能作为返回类型参数的参数类型 星号投影: 我们引用官网的吧-- For ...