Проверка схемы карниза с помощью colanderalchemy

Документация Cornice упоминает, как проверить вашу схему, используя дуршлаг MappingSchema подкласс. Как мы должны использовать схему colanderalchemy для той же цели? Потому что, если мы создадим схему с использованием colanderalchemy, как указано в документации, объект схемы уже создал экземпляр класса дуршлаг, и я думаю, что это приведет к ошибке.

Чтобы быть более точным, вот мой пример кода:

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 decorator) - это экземпляр автоматически сгенерированной схемы с помощью colanderalchemy.

Кто-нибудь знает, как решить эту проблему?

Спасибо всем заранее!

1 ответ

Решение

По-видимому, это связано с тем, что 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'>

Это связано с тем, что Cornice не печатает на утке, а ожидает, что вся схема будет подклассом MappingSchema. Тем не менее, MappingSchema - это просто схема с типом /schema_type, который является Mapping (что возвращает ColanderAlchemy).

Я посмотрю, смогу ли я внести некоторые изменения, чтобы это исправить.

Обновить

Несмотря на имена, "typ" и "schema_type" имеют две разные цели. Тип всегда говорит вам тип экземпляра схемы. 'schema_type' - это метод, который вызывается, чтобы дать SchemaNode тип по умолчанию при его создании (поэтому он вызывается в __init__ если вы не пройдете typ в, но кроме этого он не должен использоваться).

Карниз был исправлен для правильного использования typ сейчас (хотя, по состоянию на это сообщение, это не часть последнего выпуска).

Другие вопросы по тегам