使用滤器化学进行檐口模式验证

Cornice schema validation with colanderalchemy

Cornice 的 documentation mentions how to validate your schema using a colander's MappingSchema subclass. How should we use a colanderalchemy schema for the same purpose? Because if we create a schema using colanderalchemy as stated in the documentation,模式对象已经实例化了漏勺的 class,我认为这会导致错误。

更准确地说,这是我的示例代码:

from sqlalchemy.ext.declarative import declarative_base
from cornice.resource import resource, view
from colanderalchemy import SQLAlchemySchemaNode
from sqlalchemy import (
    Column,
    Integer,
    Unicode,
    )

Base = declarative_base()

'''
SQLAlchemy part
'''

class DBTable(Base):
    __tablename__ = 'mytable'

    id = Column(Integer, primary_key=True,
                info={'colanderalchemy': {'exclude': True}})
    name = Column(Unicode(70), nullable=False)
    description = Column(Unicode(256))


'''
ColanderAlchemy part
'''

ClndrTable = SQLAlchemySchemaNode(DBTable)


'''
Cornice part
'''

PRF='api'

@resource(collection_path='%s/' % PRF, path='%s/{fid}' % PRF)
class TableApi(object):
    def __init__(self, request):
        self.request = request

    @view(schema=ClndrTable, renderer='json')
    def put(self):
        # do my stuff here
        pass

其中 ClndrTable 是我自动生成的架构。现在,在尝试部署此代码时,出现以下错误:

NotImplementedError: Schema node construction without a typ argument or a schema_type() callable present on the node class

正如我之前提到的,我怀疑问题在于 ClndrTable(作为 view 装饰器的参数给出)是由 colanderalchemy 自动生成的模式的实例。

有人知道如何解决这个问题吗?

提前致谢!

这似乎是由于漏勺同时具有 typ 属性 和 schema_type 属性 的问题。它们都应该告诉您模式的类型,但它们实际上可以是不同的值。我 filed an issue with colander,但如果有修复,它可能不会很快进入 pypi。

那么令人高兴的是:ColanderAlchemy 忽略 schema_type 并使用 typ 而 Cornice 忽略 typ 并使用 schema_type.

您可以通过以下方式破解修复:ClndrTable.schema_type = lambda: ClndrTable.typ

但是,这只会将您引向下一个例外:

cornice.schemas.SchemaError: schema is not a MappingSchema: <class 'colanderalchemy.schema.SQLAlchemySchemaNode'>

这是因为 Cornice 不是 duck typing,而是希望所有 Schema 都是 MappingSchema 的子类。然而,MappingSchema 只是一个模式 typ/schema_type 正在映射(这就是 ColanderAlchemy returns)。

我会看看是否可以进行一些更改来解决此问题。

更新

尽管名称不同,'typ' 和 'schema_type' 有两个不同的用途。 'typ' 总是告诉您架构的类型 实例 。 'schema_type' 是一种在实例化时为 SchemaNode 提供默认类型的方法(因此如果您不传递 typ 则在 __init__ 中调用它,但除此之外它是不应该被使用)。

Cornice 已被修补,现在可以正确使用 typ(不过,截至此消息,它不是最新版本的一部分)。