Morepath的Cerberus验证支持
项目描述
more.cerberus:Morepath的验证和归一化支持
此包提供了对Cerberus数据验证库的Morepath集成
Cerberus可以在HTTP API中自动化用户输入验证和归一化
模式
您可以简单地定义模式为一个Python字典
user_schema = {
'name': {'type': 'string', 'minlength' : 3, 'required': True},
'age': {'type': 'integer', 'min': 0, 'required': True}
}
或者您可以使用yaml定义模式,并使用pyyaml加载它
user:
name:
type: string
minlength: 3
required: true
age:
type: integer
min: 0
required: true
import yaml
with open('schema.yml') as schema:
schema = yaml.load(schema)
user_schema = schema['user']
验证
《more.cerberus》集成帮助验证请求体,当其通过POST或PUT方法发送到视图时。首先,我们必须为我们的模式创建一个加载器
from more.cerberus import loader
user_schema_load = loader(user_schema)
我们可以使用这个加载器来处理PUT或POST请求,例如
@App.json(model=User, request_method='POST', load=user_schema_load)
def user_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
更新模型
默认情况下,在PUT或PATCH请求中,load函数将validate()方法的update标志设置为True,因此不会检查必需字段。对于其他请求,如POST,update为False。
您可以通过将update参数传递给load函数来手动设置此参数
user_schema_load = loader(user_schema, update=False)
@App.json(model=User, request_method='PUT', load=user_schema_load)
def user_put(self, request, json):
自定义验证器
使用Cerberus,您可以通过继承CerberusValidator来自定义规则、数据类型、验证器、规范器(用于规范化)和默认设置器
import re
from more.cerberus import CerberusValidator
class CustomValidator(CerberusValidator):
def _check_with_validate_email(self, field, value):
match = re.match(
'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$',value
)
if match == None:
self._error(field, 'Not valid email')
def _normalize_coerce_normalize_email(self, value):
parts = value.split('@')
if len(parts) != 2:
return value
else:
domain = parts[1].lower
if domain == 'googlemail.com':
domain = 'gmail.com'
return parts[0] + '@' + domain
您必须将自定义验证器类传递给load函数
user_schema_load = loader(user_schema, validator=CustomValidator)
现在您可以在模式中使用新的电子邮件验证器和规范器
user_schema = {
'name': {
'type': 'string',
'minlength' : 3,
'required': True,
},
'email': {
'type': 'string',
'check_with': 'validate_email',
'coerce': 'normalize_email',
'required': True,
}
}
或者使用YAML
user:
name:
type: string
minlength: 3
required: true
email:
type: string
check_with: validate_email
coerce: normalize_email
required: true
有关如何自定义验证器的更多信息,请参阅Cerberus文档。
在您的自定义验证器中使用请求或应用实例
在CerberusValidator中,您可以通过self.request访问request,并通过self.request.app访问app。这样,您可以在扩展规则时使用例如Morepath设置和服务。
以下是一个auth-boilerplate的示例,用于使用基于email_validator的服务进行自定义电子邮件验证和规范化
from more.cerberus import CerberusValidator
from email_validator import EmailSyntaxError, EmailUndeliverableError
class Validator(CerberusValidator):
def _check_with_verify_email(self, field, value):
email_validation_service = self.request.app.service(
name='email_validation'
)
try:
email_validation_service.verify(value)
except EmailSyntaxError:
self._error(field, 'Not valid email')
except EmailUndeliverableError:
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'
)
return email_validation_service.normalize(value)
错误处理
如果由于验证错误(例如,缺少必需字段或字段数据类型不正确)而导致验证失败,您希望显示某种错误消息。由more.cerberus创建的load函数在出现错误时引发more.cerberus.ValidationError异常。
此异常对象有一个包含验证错误的errors属性。您必须为它定义一个异常视图,否则验证错误将以“500内部服务器错误”的形式返回给API用户。
此包提供了一个默认的异常视图实现。如果您从more.cerberus.CerberusApp继承您的应用程序,那么您将获得一个默认的ValidationError错误视图,该视图具有422状态码,并带有包含Cerberus错误结构的JSON响应。
from more.cerberus import CerberusApp
class App(CerberusApp):
pass
现在,您的应用程序内置了合理的错误处理功能。
如果您想要不同的错误视图,您也可以自己创建它,例如
from more.cerberus.error import ValidationError
from .app import App
@App.json(model=ValidationError)
def validation_error(self, request):
@request.after
def set_status(response):
response.status = 422
errors = list(self.errors.values())[0][0]
return {
'errors': errors
}
这可以用于从如字典包装的架构中提取错误
article-schema:
article:
type: dict
schema:
title:
type: string
required: true
body:
type: string
required: true
变更
0.3 (2020-04-26)
移除:移除了对Python 2的支持。
如果您想使用此版本,必须升级到Python 3。
增加了对Python 3.7和3.8以及PyPy 3.6的支持。
将Python 3.7作为默认的测试环境。
将Cerberus升级到版本1.3.2。
添加了对Black代码格式化器的集成。
0.2 (2018-02-11)
添加了对Python 3.6的支持。
在README中添加了创建自定义错误视图的示例。
一些小的修复。
0.1 (2017-03-17)
首次公开发布。
项目详情
更多.cerberus-0.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 08753d33cf1f1832b1fe4efc56a3f9da0e7c97f9bc9764e53f585f200f64f2c9 |
|
MD5 | 24eca2fe7083beaf47e90b4fbca7bded |
|
BLAKE2b-256 | 54efb626250917be2074b66f445f9621fd3cfaabe5eab1cb52b60ec712101837 |
更多.cerberus-0.3-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b40d46c9f0a428680dd6ef33bfd525004beafe6087c3330f67d98234e4137cae |
|
MD5 | 6916872f6cc4075913b5894509189582 |
|
BLAKE2b-256 | 12e4c6512f6aeed0510d31d5155aba6406c8c7da86808293053ee50a1159e07b |