对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, 所以不检查必需字段。其他要求,如 postupdateFalse

可以通过传递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.requestappself.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)

  • 首次公开发行。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JAXB封送字符串,具有xml值,且不转义该值   java ModelMapper转换器不工作   java像HH000412或HCANN000001这样的前缀是什么意思?   验证日期输入修复java。lang.numberformatexception错误   当表具有外键时,java Telosys代码生成失败   如何使所有派生类一起只能实例化一个实例的单例抽象基类?(爪哇)   java如何在非静态服务类中使用广播接收器   java nutch爬虫相对URL问题   使用Jboss DMR下载/保存java附件   Rest模板:无法提取响应:当我们得到xml响应时,没有找到适合响应类型的HttpMessageConverter,没有绑定到JAVA对象   java如何编写可扩展窗格/面板/卡的代码   java是在ITreeViewerListener的treeExpanded()之前调用ContentProvider的getChildren()吗?   java将JComponent添加到小程序窗格   java混淆:使用简单逻辑的Flames程序