跳转到主要内容

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,updateFalse

您可以通过将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)

  • 首次公开发布。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

more.cerberus-0.3.tar.gz (9.6 kB 查看哈希值)

上传时间

构建版本

more.cerberus-0.3-py2.py3-none-any.whl (8.9 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者