Próbowałem rozwiązać ten sam problem, a ponieważ arnaud576875 mówi, że musisz dodać nagłówek tokenu csrf na każdym żądaniu ajaxowym, tak jak w dokumentach Django mówi https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax I wykonaj ten kod przed każdym żądaniem Ajaxa.
Ale jest coś dodatkowego, musisz znaleźć sposób na załadowanie tokena csrf do ciasteczek swojej aplikacji zanim spróbujesz wykonać dowolne żądanie AJAX, po wielu bolesnych godzinach szukania nie mogłem znaleźć konkretnej odpowiedzi o tym, jak to zrobić, znalazłem to, aby upewnić się, że Twój widok wysyła token csrf w pliku cookie, możesz użyć ensure_csrf_token()
do każdego widoku, który chcesz otrzymać token https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie, co wydaje się działać dla wielu osób, ale nie zadziałał dla mnie.
Innym sposobem jest użycie starszej metody, dodając 'django.middleware.csrf.CsrfResponseMiddleware'
do swojej MIDDLEWARE_CLASSES
, ale nie polecam tej metody, ponieważ pozostawia wiele zagrożeń bezpieczeństwa. https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method
Wszystkie te metody, które powiedziałem wcześniej, nie sprawdziły się u mnie. Sposób, w jaki zezwalam Ajaxowi na wykonanie niektórych żądań, jest następujący i jeśli ktoś uzna to za niebezpieczną metodę, proszę dać mi znać:
- Przejdź do pierwszego widoku, w które trafi Twój użytkownik, np./strona główna/strona.
- Włóż to przed przekierowaniem lub analizowania niczego
request.META["CSRF_COOKIE_USED"] = True
I to, że jest to sposób, który działa dla mnie, ale jak już mówiłem, że nie jestem pewien, czy jest to odpowiednia metoda lub najbardziej bezpieczny jeden do osiągnięcia ochrony csrf.
Wierzę, że możesz znaleźć odpowiedź [tutaj] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/). Najprostszym rozwiązaniem wydaje się wyłączanie ochrony CSRF w instancji django. Następną najlepszą opcją jest aktualizacja loginu JavaScript, aby pobrać token CSRF Django z formularza i dołączyć go jako część żądania AJAX. – aroth
Spójrz na moją poprzednią odpowiedź. http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd