赵走x博客
网站访问量:151882
首页
书籍
软件
工具
古诗词
搜索
登录
Flask 实战:41、电子邮件进阶实践
Flask 实战:40、使用事务邮件服务SendGird
Flask 实战:39、使用Flask-Mail发送电子邮件
Flask 实战:38、数据库进阶实践
Flask 实战:37、更新数据库表
Flask 实战:36、定义关系
Flask 实战:35、在视图函数里操作数据库
Flask 实战:34、数据库操作:CRUD
Flask 实战:33、使用Flask-SQLAlchemy管理数据库
Flask 实战:32、ORM魔法
Flask 实战:31、数据库的分类
Flask 实战:30、单个页面多个表单
Flask 实战:29、单个表单多个提交按钮
Flask 实战:28、使用Flask-CKEditor集成富文本编辑器
Flask 实战:27、多文件上传
Flask 实战:26、文件上传
Flask 实战:25、自定义验证器
Flask 实战:24、使用宏渲染表单
Flask 实战:23、设置错误消息语言
Flask 实战:22、处理表单数据
Flask 实战:21、使用Flask-WTF处理表单
Flask 实战:20、HTML表单
Flask 实战:19、模板进阶实践
Flask 实战:18、模板结构组织
Flask 实战:17、模板辅助工具
Flask 实战:16、模板基本用法
Flask 实战:15、HTTP进阶实践
Flask 实战:14、Flask上下文
Flask 实战:13、HTTP响应
Flask 实战:12、HTTP请求
Flask 实战:11、请求响应循环
Flask 实战:10、Flask与MVC架构
Flask 实战:9、模板与静态文件
Flask 实战:8、Flask命令
Flask 实战:7、URL与端点
Flask 实战:6、项目配置
Flask 实战:5、Flask扩展
Flask 实战:4、Python Shell
Flask 实战:3、启动开发服务器
Flask 实战:2、Hello,Flask!
Flask 实战:1、初识Flask
Flask 实战:25、自定义验证器
资源编号:75876
Python Web
Flask Web开发实战:入门、进阶与原理解析
热度:83
在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,这一节我们会介绍如何编写自定义验证器。
在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,这一节我们会介绍如何编写自定义验证器。 ### 1.行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还可以在表单类中定义方法来验证特定字段,如代码清单所示: ``` 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异常,传入错误消息作为参数。因为这种方法仅用来验证特定的表单类字段,所以又称为行内验证器(in-line validator)。 ### 2.全局验证器 如果你想要创建一个可重用的通用验证器,可以通过定义一个函数实现。如果不需要传入参数定义验证器,那么一个和表单类中定义的验证方法完全相同的函数就足够了,如代码清单所示: ``` from wtforms.validators import ValidationError def is_42(form, field): if field.data != 42: raise ValidationError('Must be 42') class FortyTwoForm(FlaskForm): answer = IntegerField('The Number', validators=[is_42]) submit = SubmitField() ``` 当使用函数定义全局的验证器时,我们需要在定义字段时在validators列表里传入这个验证器。因为在validators列表中传入的验证器必须是可调用对象,所以这里传入了函数对象,而不是函数调用。 这仅仅是一个简单的示例,在现实中,我们通常需要让验证器支持传入参数来对验证过程进行设置。至少,我们应该支持message参数来设置自定义错误消息。这时验证函数应该实现成工厂函数,即返回一个可调用对象的函数,如代码清单所示: ``` from wtforms.validators import ValidationError def is_42(message=None): if message is None: message = 'Must be 42.' def _is_42(form, field): if field.data != 42: raise ValidationError(message) return _is_42 class FortyTwoForm(FlaskForm): answer = IntegerField('The Number', validators=[is_42()]) submit = SubmitField() ``` 在现在的is_42()函数中,我们创建了另一个_is_42()函数,这个函数会被作为可调用对象返回。is_42()函数接收的message参数用来传入自定义错误消息,默认为None,如果没有设置就使用内置消息。在validators列表中,这时需要传入的是对工厂函数is_42()的调用。 在更复杂的验证场景下,你可以使用实现了__call__()方法的类(可调用类)来编写验证器,具体请参考WTForms文档相关章节([http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators](http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) )。