首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用colanderalchemy验证科尼斯模式

用colanderalchemy验证科尼斯模式
EN

Stack Overflow用户
提问于 2015-06-09 15:34:55
回答 1查看 417关注 0票数 1

科尼斯的文档提到了如何使用冒号的MappingSchema子类验证您的模式。我们应该如何为同样的目的使用colanderalchemy模式?因为如果我们使用文档中所述的colanderalchemy创建模式,那么模式对象已经实例化了colander的类,我认为这会导致一个错误。

更准确地说,下面是我的示例代码:

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

代码语言:javascript
复制
NotImplementedError: Schema node construction without a typ argument or a schema_type() callable present on the node class

正如我前面提到的,我怀疑问题在于ClndrTable (作为view装饰器的一个参数)是colanderalchemy自动生成模式的实例化。

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

谢谢大家提前!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 16:15:26

这似乎是因为冒号同时具有typ属性和schema_type属性。它们都应该告诉您模式的类型,但它们实际上可以是不同的值。我向科兰德提出一个问题,但是如果有一个修复,它很可能不会在任何时候到达pypi。

所以发生的事情是: ColanderAlchemy忽略了schema_type,使用了typ,而科尼斯忽略了typ,使用了schema_type

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

然而,这只会导致您进入下一个例外:

代码语言:javascript
复制
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的问题(不过,就这条消息而言,它并不是最新版本的一部分)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30736627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档