Myślę, że powinieneś podać kod, jak uzyskać token csrf w kodzie HTML/JS i ustawienia dla middleware. Najpierw sprawdź, czy django.middleware.csrf.CsrfViewMiddleware
jest włączony.
Miałem podobny problem, gdy w kodzie Pythona użyłem request.META.get('CSRF_COOKIE')
, aby uzyskać token.
Gdy używasz tego tokena w szablonie - {% csrf_token %}
Django zauważa, że token został wyrenderowany i ustawia plik Cookie w CsrfViewMiddleware.process_response
. Jeśli otrzymasz wartość tokena w inny sposób, Django przegapi tę flagę. Tak więc wygeneruje token, ale nie ustawi odpowiedniego pliku cookie.
Mam 2 obejścia w kodzie. Powinieneś dodać go do swoich widoków, które są używane do generowania szablonów z kodem JS.
1. Można wymusić Django ustawić CSRF cookie:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2. Django automatycznie ustawia CSRF_COOKIE_USED jeśli zadzwonisz get_token
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)
Każde z tych rozwiązań powinien działać osobno. Radzę użyć get_token
Miał podobny problem wcześniej, miał do czynienia z dekoratorem csrf_protect.Jeśli publikujesz ze strony do innego adresu URL (ajax dla przykładu) i jeśli korzystasz z dekoratora @csrf_protect itp upewnij się, że zarówno widok, który publikujesz dane z i adres URL otrzymujący dane pocztowe do tego dekoratora. – sidarcy
Twój widok, twój formularz szablonu? –