Джанго Пост 403 запрещено CSRF - PullRequest
0 голосов
/ 28 мая 2018

У меня есть простой веб-крючок Django, который продолжает возвращать 403 forbidden, несмотря на то, что я пометил его csrf_exempt.

Вот соответствующий код:

urls.py

 ...
 url(r'^mail/$', MailView.as_view(), name="mail"),
 ...

view.py

class MailView(View):
    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(MailTrackingView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        return HttpResponse(status=204)

При отправке данных на эту конечную точку Django дает

Forbidden (CSRF cookie not set.): /mail/

Что еще мне нужно установить, чтобы проверка CSRF не выполняласьвыполняется?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я считаю, что вы должны обернуть его внутри method_decorator Попробуйте

class MailView(View):
    @method_decorator(csrf_exempt))        
    def dispatch(self, *args, **kwargs):
        return super(MailTrackingView, self).dispatch(*args, **kwargs)

Вы также можете сделать:

@method_decorator(csrf_exempt, name='dispatch')
class MailView(View):

Обновление

У вас есть CSRF_USE_SESSIONS установлено значение True?

Вот код, который я использовал для его проверки, и он работает как положено;если декоратор закомментирован, я получаю ошибку 403 CSRF, если она оставлена, то моя запись завершается успешно.

Просмотр файла

class MyView(View):

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super(MyView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        return HttpResponse(status=204)

    def get(self, request, *args, **kwargs):
        form = """
        Authenticated: {}
        <form method="post">
            <label for="your_name">Your name: </label>
            <input id="your_name" type="text" name="your_name">
            <input type="submit" value="OK">
        </form>
        """.format(request.user.is_authenticated())
        return HttpResponse(form)

Файл URLs

    url(r'^test/', views.MyView.as_view()),
0 голосов
/ 28 мая 2018

Добавьте {% csrf_token%} в форму в шаблоне.

И объявите:

CSRF_COOKIE_SECURE = True

https://docs.djangoproject.com/en/2.0/ref/settings/#csrf-cookie-secure

...