【问题标题】:Django REST Framework PUT doesn't create new object?Django REST Framework PUT 不创建新对象?
【发布时间】:2019-12-04 07:40:25
【问题描述】:

当使用site.com/demos/:id 之类的URL 向generics.RetrieveUpdateDestroyAPIView 发送PUT 请求时,其中id 与数据库中的任何现有对象都不匹配,将返回404 响应。但是根据RFC 7231

PUT 方法请求创建目标资源的状态或将其替换为请求消息负载中包含的表示定义的状态。

这不违反 RFC 吗?

【问题讨论】:

    标签: django http django-rest-framework


    【解决方案1】:

    这显然违反了 PUT 的预期语义。在 PUT 上返回 404 没有任何意义,因为 PUT 不需要预先存在资源。

    【讨论】:

    • 那么,PUT 在这种情况下应该返回什么?
    • 它应该要么成功(最好),要么返回一个状态码,表明不支持 PUT 创建资源(例如,409)。
    • 我从来没有在一堆主流框架中看到过这样的默认行为,如果匹配的记录不存在,它们中的大多数都会返回404。顺便说一句,因为与 drf 有关的问题,返回 409 不是一个好主意,例如默认情况下,如果某处已经定义了相同的端点,端点将返回它。可能很难调试。
    【解决方案2】:

    一般来说,不会。我想在这里获得完整的报价:

    PUT 方法请求目标资源的状态 由表示定义的状态创建或替换 包含在请求消息有效负载中。给定的成功 PUT 表示将建议在同一目标上的后续 GET 资源将导致在一个等价的表示被发送 200(确定)响应。 但是,不能保证

    你怎么能看到只有“建议”而没有任何保证,一般来说,遵循 RFC 规则是一个很好的建议(Django 大多这样做),记住 REST 只是架构风格,它仍然取决于你如何实现它。

    【讨论】:

    • 我认为这句话并不能真正回答这个问题,它只是暗示 PUT 请求之后可能发生的事情。
    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 2018-01-08
    • 2014-04-03
    • 2018-12-05
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多