对morepath的cerberus验证支持
more.cerberus的Python项目详细描述
more.cerberus:对morepath的验证和规范化支持
此包为Cerberus数据验证提供了更多路径集成 库:
cerberus可以在http api中自动化用户输入验证和规范化。
模式
您可以简单地将模式定义为python dict:
user_schema={'name':{'type':'string','minlength':3,'required':True},'age':{'type':'integer','min':0,'required':True}}
另外,还可以在yaml中定义模式并加载它。 使用pyyaml:
user:name:type:stringminlength:3required:trueage:type:integermin:0required:true
importyamlwithopen('schema.yml')asschema:schema=yaml.load(schema)user_schema=schema['user']
验证
more.cerberus集成有助于 在将请求主体发布或放置到视图时对其进行验证。 首先,我们必须为模式创建一个加载程序:
frommore.cerberusimportloaderuser_schema_load=loader(user_schema)
我们可以使用此加载器处理PUT或POST请求,例如:
@App.json(model=User,request_method='POST',load=user_schema_load)defuser_post(self,request,json):# json is now a validated and normalized dict of whatever got# POST onto this view that you can use to update# self
更新型号
默认情况下,in put或patch请求load函数 将validate()方法的update标志设置为True, 所以不检查必需字段。其他要求,如 postupdate是False。
可以通过传递update参数来手动设置 到load函数:
user_schema_load=loader(user_schema,update=False)@App.json(model=User,request_method='PUT',load=user_schema_load)defuser_put(self,request,json):
自定义验证器
使用cerberus,您可以自定义规则、数据类型、验证器, 强制(用于规范化)和通过子类化的默认setter CerberusValidator:
importrefrommore.cerberusimportCerberusValidatorclassCustomValidator(CerberusValidator):def_validator_validate_email(self,field,value):match=re.match('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$',value)ifmatch==None:self._error(field,'Not valid email')def_normalize_coerce_normalize_email(self,value):parts=value.split('@')iflen(parts)!=2:returnvalueelse:domain=parts[1].lowerifdomain=='googlemail.com':domain='gmail.com'returnparts[0]+'@'+domain
必须将自定义验证器类传递给load函数:
user_schema_load=loader(user_schema,validator=CustomValidator)
现在您可以在模式中使用新的电子邮件验证程序和规范化程序:
user_schema={'name':{'type':'string','minlength':3,'required':True},'email':{'type':'string','validator':'validate_email','coerce':'normalize_email','required':True}}
或使用yaml:
user:name:type:stringminlength:3required:trueemail:type:stringvalidator:validate_emailcoerce:normalize_emailrequired:true
有关如何自定义验证器的更多信息,请查看 Cerberus documentation。
在自定义验证器中使用请求或应用程序实例
在CerberusValidator中,您可以通过 self.request和app到self.request.app。 这样,您可以在以下情况下使用更多路径设置和服务 扩展规则。
这里有一个来自auth-boilerplate的示例,用于自定义电子邮件验证和 使用基于email_validator:
的服务进行规范化frommore.cerberusimportCerberusValidatorfromemail_validatorimportEmailSyntaxError,EmailUndeliverableErrorclassValidator(CerberusValidator):def_validator_verify_email(self,field,value):email_validation_service=self.request.app.service(name='email_validation')try:email_validation_service.verify(value)exceptEmailSyntaxError:self._error(field,'Not valid email')exceptEmailUndeliverableError:self._error(field,'Email could not be delivered')def_normalize_coerce_normalize_email(self,value):email_validation_service=self.request.app.service(name='email_validation')returnemail_validation_service.normalize(value)
错误处理
如果验证由于验证错误而失败(必需字段是 缺少,或者字段的数据类型不正确(例如) 显示某种错误消息。由创建的load函数 more.cerberus引发more.cerberus.ValidationError异常 以防出错。
此异常对象有一个带有验证错误的errors属性。 必须为其定义异常视图,否则验证错误为 作为“500内部服务器错误”返回给API用户。
此包提供默认的异常视图实现。如果你分类 您的应用程序来自more.cerberus.CerberusApp,然后您将获得一个默认值 具有422状态代码和json的ValidationError的错误视图 用cerberus错误结构响应:
frommore.cerberusimportCerberusAppclassApp(CerberusApp):pass
现在你的应用程序有了合理的内置错误处理。
如果您想要一个不同的错误视图,可以创建它 一个人,例如:
frommore.cerberus.errorimportValidationErrorfrom.appimportApp@App.json(model=ValidationError)defvalidation_error(self,request):@request.afterdefset_status(response):response.status=422errors=list(self.errors.values())[0][0]return{'errors':errors}
这可用于从封装到的架构中提取错误 像这样的字典:
article-schema:article:type:dictschema:title:type:stringrequired:truebody:type:stringrequired:true
更改
0.2(2018-02-11)
- 添加Python3.6支持。
- 添加用于创建自述文件的自定义错误视图的示例。
- 一些小的修正。
0.1(2017-03-17)
- 首次公开发行。