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
到期请求。如果你在某处检查它,不仅要处理动作名称,还要处理请求方法和请求路径。
【讨论】:
这是最简单的方法。 我也面临同样的问题。我收到403
或405
错误与delete
请求。但是添加@action
装饰器并没有帮助@csrf_exempt
以上是关于Django/DRF - 405 方法不允许删除操作的主要内容,如果未能解决你的问题,请参考以下文章
jQuery-File-upload:删除时出现 405 错误“方法不允许”
删除返回错误 405(不允许方法) 我正在使用 React 和 ASP.net。我没有大多数人说要编辑的网络配置文件,所以我迷路了