科尼斯的文档提到了如何使用冒号的MappingSchema子类验证您的模式。我们应该如何为同样的目的使用colanderalchemy模式?因为如果我们使用文档中所述的colanderalchemy创建模式,那么模式对象已经实例化了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是我自动生成的模式。现在,在尝试部署此代码时,我得到以下错误:
NotImplementedError: Schema node construction without a typ argument or a schema_type() callable present on the node class正如我前面提到的,我怀疑问题在于ClndrTable (作为view装饰器的一个参数)是colanderalchemy自动生成模式的实例化。
有人知道怎么解决这个问题吗?
谢谢大家提前!
发布于 2015-06-10 16:15:26
这似乎是因为冒号同时具有typ属性和schema_type属性。它们都应该告诉您模式的类型,但它们实际上可以是不同的值。我向科兰德提出一个问题,但是如果有一个修复,它很可能不会在任何时候到达pypi。
所以发生的事情是: ColanderAlchemy忽略了schema_type,使用了typ,而科尼斯忽略了typ,使用了schema_type。
您可以使用以下方法破解修补程序:ClndrTable.schema_type = lambda: ClndrTable.typ
然而,这只会导致您进入下一个例外:
cornice.schemas.SchemaError: schema is not a MappingSchema: <class 'colanderalchemy.schema.SQLAlchemySchemaNode'>这是因为科尼斯不是鸭子类型,而是希望所有模式都是MappingSchema的一个子类。但是,MappingSchema只是一个模式,类型/ Schema _type正在映射(这是ColanderAlchemy返回的内容)。
我看看能不能做些修改来解决这个问题。
更新
尽管有名字,“typ”和“schema_type”有两个不同的用途。‘type’总是告诉您架构实例的类型。'schema_type‘是一个被调用的方法,用于在实例化时为SchemaNode提供默认类型(因此,如果不传递typ,则在__init__中调用它,但除此之外,不应该使用它)。
现在已经修补好了正确使用typ的问题(不过,就这条消息而言,它并不是最新版本的一部分)。
https://stackoverflow.com/questions/30736627
复制相似问题