用colanderalchemy验证檐口模式

2024-04-20 15:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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是我自动生成的模式。现在,在尝试部署此代码时,我收到以下错误:

^{pr2}$

如前所述,我怀疑问题在于ClndrTable(作为view修饰符的参数给出)是colanderalchemy自动生成的模式的实例化。在

有人知道怎么解决这个问题吗?在

提前谢谢大家!在


Tags: fromimportselfviewrequestunicode模式column
1条回答
网友
1楼 · 发布于 2024-04-20 15:02:58

这似乎是由于colander同时具有typ属性和schema_type属性的问题。它们都应该告诉你模式的类型,但实际上它们可能是不同的值。我filed an issue with colander,但如果有一个修复,它很可能不会很快到达pypi。在

所以发生了什么:漏勺炼金术忽略了schema_type,使用了typ,而檐口忽略了{},使用了{}。在

您可以用以下方法破解修复程序:ClndrTable.schema_type = lambda: ClndrTable.typ

但是,这只会导致下一个例外:

cornice.schemas.SchemaError: schema is not a MappingSchema: <class 'colanderalchemy.schema.SQLAlchemySchemaNode'>

这是因为Cornice不是duck类型,而是期望all Schema是MappingSchema的一个子类。然而,MappingSchema只是一个typ/Schema_类型是映射的模式(ColanderAlchemy返回的结果)。在

我看看我能不能做些改变来解决这个问题。在

更新

尽管名称是'typ'和'schema\u type'有两个不同的用途typ'总是告诉您模式实例的类型'schema_type'是一个方法,当SchemaNode被实例化时,它被调用给一个默认类型(因此,如果您没有在__init__中传递一个typ,但它不应该被使用,则在__init__中调用)。在

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

相关问题 更多 >