33
There is a section of Django’s CSRF Protection documentation titled View needs protection for one path which describes a solution. The idea is to use @csrf_exempt
on the whole view, but when the API client header is not present or invalid, then call a function
annotated with @csrf_protect
.
66
Modify urls.py
If you manage your routes in urls.py
, you can wrap your desired routes with csrf_exempt()
to exclude them from the CSRF verification middleware.
for instance,
from django.views.decorators.csrf import csrf_exempt
urlpatterns = patterns(
# ...
# Will exclude `/api/v1/test` from CSRF
url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view()))
# ...
)
Alternatively, as a Decorator
Some may find the use of the @csrf_exempt
decorator more suitable for their needs
for instance,
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
- [Django]-Django Broken pipe in Debug mode
- [Django]-Is there something similar to 'rake routes' in django?
- [Django]-Django select only rows with duplicate field values
7
If you are you using class base view (CBV) and want to use the csrf_exempt decorator you will need to use the method decorator.
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
@method_decorator(csrf_exempt, name='dispatch')
class MyView(View):
def post(self, request):
pass # my view code here
- [Django]-How can I make a trailing slash optional on a Django Rest Framework SimpleRouter
- [Django]-Create Django model or update if exists
- [Django]-Django: Why do some model fields clash with each other?
1
In my case, I am using JWT authentication plus csrf_token for some views. And for some reasons that I am unaware of, csrf_exempt
does not work when I set it as a decorator or when I wrap the view name in the url patterns.
So here’s what I ended up doing. I overrided the initialize_request
available in the APIView
class.
class ClasssName(views.APIView):
def initialize_request(self, request, *args, **kwargs):
setattr(request, 'csrf_processing_done', True)
return super().initialize_request(request, *args, **kwargs)
- [Django]-Django serializer inherit and extend fields
- [Django]-Django rest framework: set field-level error from serializer validate() method
- [Django]-Prefetch_related for multiple Levels