Django/DRF - 在DELETE操作上出现405 Method not allowed错误

21

我在本地机器上使用两个开发服务器(Node和Django的)。

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

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

当我尝试DELETE时,收到了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

请注意,允许的方法列表中没有DELETEPATCH / PUT

我的配置是否有遗漏?


你的视图实现了这些方法吗?你使用了ModelViewSet、mixings或ApiView吗? - argaen
好老的viewsets.ModelViewSet - 测试运行完美。 - haki
你的视图中允许哪些方法?由于文档中CORS_ALLOW_METHODS定义了全局可用的方法,但不会自动将其添加到视图中。还有一点需要注意:CORS_ORIGIN_ALLOW_ALL必须是布尔值,而非字符串类型。 - coldmind
@coldmind - 你是对的 - 它是一个布尔值 - 我已经更改了它,结果相同。我想我有点困惑于全局和视图级别CORS定义之间的区别。您介意详细说明一下如何使用ModelViewset允许在特定视图上进行DELETE吗?测试中删除方法正在工作,因此视图必须允许它,但是响应中未更新CORS标头(我认为djagno-cors-header应该这样做...) - haki
2个回答

45

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

DELETE 请求只允许在详情视图 (/api/resource/1/) 上进行。这是因为 Django REST Framework 需要知道您要删除的对象,而这些信息无法从列表视图中获取。


1
谢谢,那就是它。我从url中遗漏了pk,因此请求发送到了列表而不是详细信息页面。 - haki
如果使用DRF路由器模块,则例如user-detail支持PUT操作,而不支持user-list。http://www.django-rest-framework.org/api-guide/routers/ - Zubair Alam

15

如果您需要在DRF中将HTTP方法DELETE与没有pk的URL连接起来,请尝试在ModelViewSet内部使用以下代码:

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

更新:请注意,在ModelViewSet类内部的action属性由于请求将会是 None。如果您在某处检查它,请处理不仅仅是操作名称,还有请求方法和请求路径。


这是最简单的方法。 - minusf
我遇到了同样的问题。使用“delete”请求时,我要么得到“403”错误,要么得到“405”错误。但是添加“@action”装饰器没有帮助,也没有使用“@csrf_exempt”。 - Abhijit Ghate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接