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
SessionAuthenticationscheme used by DRF. DRF'sSessionAuthenticationuses Django's session framework for authentication which requires CSRF to be checked.When you don't define any
authentication_classesin 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 DELETErequests.What to do then?
Now to disable csrf check, you can create a custom authentication class
CsrfExemptSessionAuthenticationwhich extends from the defaultSessionAuthenticationclass. 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_classesto be:This should handle the csrf error.