使用colanderalchemy进行Cornice模式验证

时间:2015-06-09 15:34:56

标签: python sqlalchemy pyramid colanderalchemy cornice

Cornice的documentation提到了如何使用漏勺的MappingSchema子类验证您的架构。我们应该如何为同一目的使用colanderalchemy架构?因为如果我们使用documentation中所述的colanderalchemy创建模式,模式对象已经实例化了漏勺的类,我认为这会导致错误。

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

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自动生成的模式的实例化。

任何人都知道如何解决这个问题?

提前全部谢谢!

1 个答案:

答案 0 :(得分:1)

这似乎是由于漏勺具有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没有打字,但期望所有Schema都是MappingSchema的子类。但是,MappingSchema只是一个Schema,其typ / schema_type是Mapping(这是ColanderAlchemy返回的)。

我会看看是否可以制定一些修改来解决这个问题。

更新

尽管名称,'typ'和'schema_type'有两个不同的目的。 'typ'总是告诉你模式实例的类型。 'schema_type'是一个被调用的方法,当SchemaNode被实例化时它被赋予一个默认类型(如果你没有传递__init__,它会在typ中被调用,但除此之外它不是待用)。

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