fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Отключить CSRF для одного POST-запроса?

Есть некий АПИ-запрос, на который делает запрос некий сторонний сайт с некими параметрами, и после этого мне нужно сделать редирект на определенную страницу своего сайта.

from rest_framework.generics import GenericAPIView
from serializers import AddSomethingSerializer

class AddingSomething(GenericAPIView):
    permission_classes = (permissions.AllowAny, )
    serializer_class = AddSomethingSerializer
    queryset = None

    def post(self, request, **kwargs):
         # .. Some magic ..
         return HttpResponseRedirect(redirect_to=reverse('something_added'))


Все хорошо, но при редиректе со стороннего сайта возникает исключение:
"detail": "CSRF Failed: CSRF token missing or incorrect."

Как мне отключить проверку CSRF только для данного АПИ, а для других АПИ оставить в силе?

Пробовал
@method_decorator(csrf_exempt)
def post(self, request, **kwargs)

- не помогло

@method_decorator(csrf_exempt, name='dispatch')
class AddingSomething(GenericAPIView):

- не помогло

from django.views.decorators.csrf import csrf_exempt
from views import AddingSomething

urlpatterns = [
    url('^add_something/$', csrf_exempt(AddingSomething.as_view()), name='api-add-something'),
    ...

- не помогло

Вариант отключить полностью в authentication_classes - не подходит
  • Вопрос задан
  • 3015 просмотров
Решения вопроса 2
Drf при использовании SessionAuthentication принудительно делает проверку на наличие валидного CSRF токена для небезопасных методов запроса. Декораторы csrf_exempt работать не будут с SessionAuthentication.

Вариант решения вам, в принципе, уже скидывали ссылками на SO.

from rest_framework.authentication import SessionAuthentication


class CsrfExemptSessionAuthentication(SessionAuthentication):
    def enforce_csrf(self, request):
        return None


class AddingSomething(GenericAPIView):
    permission_classes = (permissions.AllowAny, )
    serializer_class = AddSomethingSerializer
    authentication_classes = (CsrfExemptSessionAuthentication,)
    queryset = None

    def post(self, request, **kwargs):
         # .. Some magic ..
         return HttpResponseRedirect(redirect_to=reverse('something_added'))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы