Cornice的documentation提到了如何使用colander的MappingSchema
子类验证模式。为了同样的目的,我们应该如何使用一个滤器炼金术模式?因为如果我们像documentation中所说的那样使用colanderachemy创建一个模式,schema对象已经实例化了colander的类,我认为这会导致错误。在
更准确地说,下面是我的示例代码:
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
是我自动生成的模式。现在,在尝试部署此代码时,我收到以下错误:
如前所述,我怀疑问题在于ClndrTable
(作为view
修饰符的参数给出)是colanderalchemy自动生成的模式的实例化。在
有人知道怎么解决这个问题吗?在
提前谢谢大家!在
这似乎是由于colander同时具有
typ
属性和schema_type
属性的问题。它们都应该告诉你模式的类型,但实际上它们可能是不同的值。我filed an issue with colander,但如果有一个修复,它很可能不会很快到达pypi。在所以发生了什么:漏勺炼金术忽略了},使用了{}。在
schema_type
,使用了typ
,而檐口忽略了{您可以用以下方法破解修复程序:
ClndrTable.schema_type = lambda: ClndrTable.typ
但是,这只会导致下一个例外:
这是因为Cornice不是duck类型,而是期望all Schema是MappingSchema的一个子类。然而,MappingSchema只是一个typ/Schema_类型是映射的模式(ColanderAlchemy返回的结果)。在
我看看我能不能做些改变来解决这个问题。在
更新
尽管名称是'typ'和'schema\u type'有两个不同的用途typ'总是告诉您模式实例的类型'schema_type'是一个方法,当SchemaNode被实例化时,它被调用给一个默认类型(因此,如果您没有在
__init__
中传递一个typ
,但它不应该被使用,则在__init__
中调用)。在Cornice已经进行了修补,现在可以正确使用
typ
(不过,截至本消息,它不是最新版本的一部分)。在相关问题 更多 >
编程相关推荐