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