使用滤器化学进行檐口模式验证
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
(不过,截至此消息,它不是最新版本的一部分)。
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
(不过,截至此消息,它不是最新版本的一部分)。