Полиморфные типы с python-eve

Я хотел бы иметь конечную точку, которая проверяется на несколько схем. Я прочитал документы и кое-что из кода Евы, но мне не сразу ясно, что это возможно. Вот простой пример того, что я хотел бы сделать:

POST http://eve-server/vehicles/
{
    type: 'Boat',
    manufacturer: 'Seadoo',
    propeller_size: 2.0
}

POST http://eve-server/vehicles/
{
    type: 'Airplane',
    manufacturer: 'Boeing',
    wing_span: 195.8
}

GET http://eve-server/vehicles/

[
    {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
    {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
]

Поддерживает ли Eve/Cerberus такие полиморфные типы? Если нет, можно ли подключить что-то вроде схемы JSON, которая поддерживает это, сохраняя ссылочную целостность, которую обеспечивает data_relation?


person pmdarrow    schedule 17.11.2014    source источник


Ответы (1)


Хм, я не уверен, что понял ваш вопрос. На первый взгляд я бы сказал, что именно так ведет себя обычная конечная точка API. Я предполагаю, что propeller_size и wing_span являются необязательными полями. Вы можете публиковать один документ за раз, как в вашем примере:

POST http://eve-server/vehicles/
{
    type: 'Boat',
    manufacturer: 'Seadoo',
    propeller_size: 2.0
}

POST http://eve-server/vehicles/
{
    type: 'Airplane',
    manufacturer: 'Boeing',
    wing_span: 195.8
}

или вы можете опубликовать список документов:

POST http://eve-server/vehicles/    
[
    {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
    {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
]

В обоих случаях, когда вы GET в одной и той же конечной точке, вы получите список доступных документов:

GET http://eve-server/vehicles/    
{
    "_items": [
        {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
        {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
    ]
    "_meta": {
        "total": 259,
        "page": 1,
        "size": 25
    }
}

Это предполагает, что HATEOAS отключен, иначе вы также получите метаполе _links.

При этом просто имейте в виду, что вы можете настроить несколько конечных точек, ориентированных на один и тот же источник данных, поэтому у вас может быть конечная точка только для POST со своей собственной схемой и проверкой и, возможно, конечная точка только для GET с другой схемой, возможно, потому, что в этой конечной точке вы возвращаете поля, которые были добавлены через монго, или перехватчики событий (обратные вызовы) или через другие конечные точки API.

person Nicola Iarocci    schedule 17.11.2014
comment
Вы говорите, пометьте wing_span и propellor size как необязательные поля. Что, если я хочу, чтобы wing_span требовалось при type == Airplane, но не при type == Boat? Нужно ли мне где-то иметь пользовательскую проверку, которая говорит if type == 'foo', then 'bar' is required, elif type == 'baz' then 'qux' is required, или есть более чистый способ сделать это? - person pmdarrow; 17.11.2014
comment
Предположим, что wing_span и propellor_size являются взаимоисключающими полями, то есть wing_span разрешено только тогда, когда type == Airplane и propellor_size разрешено только когда type == Boat. В терминах объектно-ориентированного программирования я хочу, чтобы Vehicle был базовым типом, а Boat и Airplane наследовались от этого базового типа, разделяя общие свойства и общую проверку, но каждый из которых имел свои собственные свойства и проверку. - person pmdarrow; 17.11.2014
comment
Для этого существует правило проверки dependencies, хотя сейчас оно не поддерживает значения полей. В настоящее время существует запрос на вытягивание, отвечающий вашим конкретным потребностям, поэтому ожидайте, что он скоро будет поддерживаться. Для справки: github.com/nicolaiarocci/cerberus/pull/61 - person Nicola Iarocci; 18.11.2014
comment
На самом деле поддержка значений dependencies только что была объединена. - person Nicola Iarocci; 18.11.2014
comment
Я полагаю, что dependencies сработает, наверное, я надеялся на что-то более объектно-ориентированное. Я отправлю отдельный вопрос о замене Cerberus другой валидационной библиотекой. - person pmdarrow; 18.11.2014