【问题标题】:Django (DRF) fails to POST data to url with similar pathDjango(DRF)无法将数据发布到具有相似路径的 url
【发布时间】:2019-10-09 23:48:59
【问题描述】:

在我的 url conf 中,我有两个相似的模式:

urlpatterns = [
    path('chat/', views.chat),  # create chat
    path('chat/message/', views.message),  # create message
]

第二条路径按预期工作,但是,当我尝试将数据发布到 chat/ 时,我收到错误 405 和 {"detail":"Method \"POST\" not allowed."} 错误消息。视图中的代码有效,如果我将chat/ 修改为更具体的内容,例如chat/create/,那么一切正常。然而,这不是我想要做的。我认为 django 会匹配与请求匹配的第一个 URL。为什么会这样?是这个错误还是预期的行为?

【问题讨论】:

  • 你能发表意见吗?以及您发布数据的方式
  • 视图用api_view(['POST'])装饰器标记,它们只是返回带有生成聊天/消息ID(模型)的帖子数据。我使用 curl 将数据发布到 api。如果是chat/,我发送{"user": 1} json,如果是chat/message/,我发送{"user": 1, "text": "Hello, World!", "chat": 1}。当 url 不“冲突”时,视图按预期工作。
  • @Liliane 只需编辑您的问题并在此处添加格式化的信息。
  • @Liliane 只是一个捷径。如果您不使用正则表达式锚点(不幸的是 django 2 删除了此功能),请始终尝试将大路径放在首位。

标签: python django python-3.x django-rest-framework django-urls


【解决方案1】:

我遇到了类似的问题。我创建了一个新的nested_route 装饰器,它的作用很像list_route 和detail_route。我通常重定向到另一个视图集来处理嵌套路径。问题是流被读取得太早(由父视图集调度),所以我需要确保 initialize_request 函数只为给定请求调用一次。

根据上面@rsalmaso 的评论,我用以下内容覆盖了子视图集中的initialize_request 方法。

def initialize_request(self, request, *args, **kwargs):
        if not isinstance(request, Request):
            request = super().initialize_request(request, *args, **kwargs)
        return request

这很好用,但我认为有某种属性可以忽略调度中的 initialize_request 函数或进行全局检查以仅运行initialize_request iff isinstance(request, rest_framework.request.Request) == False。如果可以接受的话,我很乐意通过测试来准备 PR。

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 2021-01-04
    • 2011-12-10
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多