【问题标题】:Polymorphic types with python-eve使用 python-eve 的多态类型
【发布时间】:2014-11-17 15:43:53
【问题描述】:

我希望有一个针对多个模式进行验证的端点。我已经阅读了文档和 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 Schema 之类的东西,同时保持 data_relation 提供的引用完整性?

【问题讨论】:

    标签: python eve


    【解决方案1】:

    嗯,我不确定我是否理解您的问题。乍一看,我会说这正是普通 API 端点的行为方式。我假设propeller_sizewing_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 元字段。

    话虽如此,请记住,您可以设置 multiple endpoints all targeting the same datasource,因此您可以拥有一个具有自己的架构和验证的仅 POST 端点,也可能拥有一个具有不同架构的仅 GET 端点,这可能是因为您返回的端点是通过 mongo、事件挂钩(回调)或其他 API 端点添加的字段。

    【讨论】:

    • 您说将wing_spanpropellor size 标记为可选字段。如果我希望在 type == Airplane 时需要 wing_span 而在 type == Boat 时不需要呢?我是否需要在某个地方进行自定义验证,上面写着if type == 'foo', then 'bar' is required, elif type == 'baz' then 'qux' is required,或者有更简洁的方法吗?
    • 假设wing_spanpropellor_size是互斥字段,即wing_span仅在type == Airplane时允许,propellor_size仅在type == Boat时允许。在面向对象的编程术语中,我希望 Vehicle 成为基本类型,BoatAirplane 从这个基本类型继承,共享公共属性和公共验证,但每个都有自己的属性和验证。跨度>
    • dependencies 验证规则,虽然现在它不支持字段值。目前有一个拉取请求可以解决您的特定需求,因此希望它很快得到支持。供参考:github.com/nicolaiarocci/cerberus/pull/61
    • 其实刚刚合并了对dependencies值的支持。
    • 我想dependencies 会起作用,我想我希望有更多面向对象的东西。我将发布一个关于用另一个验证库替换 Cerberus 的单独问题。
    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2017-01-07
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多