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自动生成的模式的实例化。
任何人都知道如何解决这个问题?
提前全部谢谢!
答案 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
(但是,截至此消息,它不是最新版本的一部分)。