I know that there are answers regarding Django Rest Framework, but I couldn't find a solution to my problem.
I have an application which has authentication and some functionality. I added a new app to it, which uses Django Rest Framework. I want to use the library only in this app. Also I want to make POST request, and I always receive this response:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
I have the following code:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
I want add the API without affecting the current application. So my questions is how can I disable CSRF only for this app ?
Note: Disabling CSRF is unsafe from security point of view. Please use your judgement to use the below method.
Why this error is happening?
This is happening because of the default
SessionAuthentication
scheme used by DRF. DRF'sSessionAuthentication
uses Django's session framework for authentication which requires CSRF to be checked.When you don't define any
authentication_classes
in your view/viewset, DRF uses this authentication classes as the default.Since DRF needs to support both session and non-session based authentication to the same views, it enforces CSRF check for only authenticated users. This means that only authenticated requests require CSRF tokens and anonymous requests may be sent without CSRF tokens.
If you're using an AJAX style API with SessionAuthentication, you'll need to include a valid CSRF token for any "unsafe" HTTP method calls, such as
PUT, PATCH, POST or DELETE
requests.What to do then?
Now to disable csrf check, you can create a custom authentication class
CsrfExemptSessionAuthentication
which extends from the defaultSessionAuthentication
class. In this authentication class, we will override theenforce_csrf()
check which was happening inside the actualSessionAuthentication
.In your view, then you can define the
authentication_classes
to be:This should handle the csrf error.