Django/DRF - 405 方法不允许删除操作

Posted

技术标签:

【中文标题】Django/DRF - 405 方法不允许删除操作【英文标题】:Django/DRF - 405 Method not allowed on DELETE operation 【发布时间】:2014-12-29 23:24:40 【问题描述】:

我正在本地机器(node 和 django)上使用两台开发服务器。

我已将django-cors-headers 添加到项目中,以允许所有来源和方法(在开发上)具有以下设置:

CORS_ORIGIN_ALLOW_ALL = 'ALL'
CORS_ALLOW_METHODS = (
        'GET',
        'POST',
        'PUT',
        'PATCH',
        'DELETE',
        'OPTIONS'
    )

我在尝试删除时收到 405。 查看响应头

HTTP/1.0 405 METHOD NOT ALLOWED
Date: Mon, 03 Nov 2014 10:04:43 GMT
Server: WSGIServer/0.1 Python/2.7.5
Vary: Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Access-Control-Allow-Origin: *
Allow: GET, POST, HEAD, OPTIONS

请注意,DELETE & PATCH / PUT 不在允许的方法列表中。

我的配置中是否缺少某些内容?

【问题讨论】:

您的视图是否实现了这些方法?你在使用模型视图集吗?混合,ApiView? 好老 viewsets.ModelViewSet - 测试运行完美。 您认为允许哪些方法?由于文档CORS_ALLOW_METHODS 只定义了可以全局使用的方法,但不会自动将其添加到视图中。还有一件事CORS_ORIGIN_ALLOW_ALL 必须是布尔值,而不是字符串。 @coldmind - 你是对的 - 这是一个布尔值 - 改变了它,同样的结果。我想我对全局和视图级别 CORS 定义之间的区别有点困惑。您介意扩展我如何使用 ModelViewset 在特定视图上允许 DELETE 吗? delete 方法在测试中有效,因此视图必须允许它,但 CORS 标头未在响应中更新(我认为 djagno-cors-header 应该这样做......) 【参考方案1】:

响应与 ViewSet 的 列表视图 (/api/resource/) 的响应看起来非常相似。列表视图仅支持GET,用于列出所有对象,POST 用于创建新对象。

DELETE 请求只允许在详细视图 (/api/resource/1/) 上。这是因为 Django REST Framework 需要知道您要删除的对象是什么,而仅从列表视图中无法检索到此信息。

【讨论】:

谢谢,就是这样。我从 url 中省略了 pk,请求发送到列表而不是详细信息。 如果使用 DRF 路由器模块,那么例如user-detail 支持 PUT 操作,而不支持 user-list。 django-rest-framework.org/api-guide/routers【参考方案2】:

如果您需要在 DRF 中将 http 方法 DELETE 与不带 pk 的 URL 连接,请在您的 ModelViewSet 中尝试此操作:

@action(methods=['delete'], detail=False)
def delete(self, request):
    # your code

UPD:请注意,ModelViewSet 类中的 action 属性将是 None 到期请求。如果你在某处检查它,不仅要处理动作名称,还要处理请求方法和请求路径。

【讨论】:

这是最简单的方法。 我也面临同样的问题。我收到403405 错误与delete 请求。但是添加@action 装饰器并没有帮助@csrf_exempt

以上是关于Django/DRF - 405 方法不允许删除操作的主要内容,如果未能解决你的问题,请参考以下文章

删除不工作在 WCF 休息服务抛出 (405) 方法不允许

jQuery-File-upload:删除时出现 405 错误“方法不允许”

YII 2,不允许的方法 (#405)

405 方法不允许 Web API 2

删除返回错误 405(不允许方法) 我正在使用 React 和 ASP.net。我没有大多数人说要编辑的网络配置文件,所以我迷路了

URLrewrite后不允许AngularJS / c#WebAPI 405方法