Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django/DRF - 405 Method not allowed on DELETE operation

I'm working with two dev servers on my local machine (node & django's).

I've added django-cors-headers to the project to allow all origins & methods (on dev) with the following settings :

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

I'm getting 405 when attempting DELETE. Looking at the response headers

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

Notice that DELETE & PATCH / PUT are not present in the allowed methods list.

Is there something missing from my configuration ?

like image 334
haki Avatar asked Nov 03 '14 10:11

haki


People also ask

How do I return 405 in Django?

If you want to return a custom one just do the following: return render(request, "Error Pages/405. html", status=405) . Notice the status, that is what will tell the browser about the code that is being returned.


2 Answers

The response looks very similar to that of the list view (/api/resource/) for a ViewSet. List views only support GET, to list all of the objects, and POST to create a new object.

DELETE requests are only allowed on the detail view (/api/resource/1/). This is because Django REST Framework needs to know what object you are looking to delete, and this information cannot be retrieved from just the list view.

like image 99
Kevin Brown-Silva Avatar answered Sep 18 '22 14:09

Kevin Brown-Silva


If you need to connect http method DELETE with URL without pk in DRF try this inside of your ModelViewSet:

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

UPD: Note that action attribute inside of ModelViewSet class will be None due request. If you check it somewhere, handle not only action name, but request method and request path.

like image 31
ncopiy Avatar answered Sep 17 '22 14:09

ncopiy