Skomentowałem linie procesora csrf i oprogramowania pośredniego w settings.py
:
122
123 TEMPLATE_CONTEXT_PROCESSORS = (
124 'django.contrib.auth.context_processors.auth',
125 # 'django.core.context_processors.csrf',
126 'django.core.context_processors.request',
127 'django.core.context_processors.static',
128 'cyathea.processors.static',
129 )
130
131 MIDDLEWARE_CLASSES = (
132 'django.middleware.common.CommonMiddleware',
133 'django.contrib.sessions.middleware.SessionMiddleware',
134 # 'django.middleware.csrf.CsrfViewMiddleware',
135 'django.contrib.auth.middleware.AuthenticationMiddleware',
136 'django.contrib.messages.middleware.MessageMiddleware',
137 'django.middleware.locale.LocaleMiddleware',
138 # Uncomment the next line for simple clickjacking protection:
139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )
Ale kiedy używam Ajax do wysyłania żądania, Django nadal odpowiada `` token csrf jest nieprawidłowy lub brakuje go '', a po dodaniu X-CSRFToken do nagłówków żądanie się powiedzie.
Co tu się dzieje ?
Odpowiedzi:
Jeśli potrzebujesz tylko widoków, aby nie używać CSRF, możesz użyć
@csrf_exempt
:Więcej przykładów i innych scenariuszy można znaleźć w dokumentacji Django:
źródło
@csrf_exemp
działa tak, jak ostatnio bez problemów. Mam nadzieję, że znajdziesz odpowiedź.Aby wyłączyć CSRF dla widoków opartych na klasach, działało dla mnie następujące rozwiązanie.
Używając django 1.10 i Pythona 3.5.2
źródło
W
setting.py
oprogramowaniu MIDDLEWARE możesz po prostu usunąć / skomentować tę linię:źródło
Dla Django 2 :
To oprogramowanie pośredniczące należy dodać w
settings.MIDDLEWARE
razie potrzeby (na przykład w ustawieniach testu).Uwaga: to ustawienie nie jest
MIDDLEWARE_CLASSES
już wywoływane .źródło
Odpowiedź może być niewłaściwa, ale mam nadzieję, że ci pomoże
Posiadanie takiego oprogramowania pośredniego pomaga debugować żądania i sprawdzać csrf na serwerach produkcyjnych.
źródło
Problem polega na tym, że SessionAuthentication wykonuje własną walidację CSRF. Dlatego pojawia się błąd braku CSRF, nawet jeśli oprogramowanie pośredniczące CSRF jest komentowane. Możesz dodać @csrf_exempt do każdego widoku, ale jeśli chcesz wyłączyć CSRF i mieć uwierzytelnianie sesji dla całej aplikacji, możesz dodać dodatkowe oprogramowanie pośredniczące, takie jak to -
Utworzyłem tę klasę w myapp / middle.py Następnie zaimportuj to oprogramowanie pośrednie w Middleware w settings.py
Działa to z DRF w django 1.11
źródło
Jeśli chcesz go wyłączyć w Global, możesz napisać niestandardowe oprogramowanie pośredniczące, w ten sposób
następnie dodaj tę klasę
youappname.middlewarefilename.DisableCsrfCheck
doMIDDLEWARE_CLASSES
list, wcześniejdjango.middleware.csrf.CsrfViewMiddleware
źródło
CSRF można wymusić na poziomie widoku, którego nie można wyłączyć globalnie .
W niektórych przypadkach jest to uciążliwe, ale hm, „to dla bezpieczeństwa”. Muszę zachować te oceny AAA.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
źródło
@WoooHaaaa Niektóre pakiety innych firm używają oprogramowania pośredniego „django.middleware.csrf.CsrfViewMiddleware”. na przykład używam django-rest-oauth i mam problem jak ty, nawet po wyłączeniu tych rzeczy. może te pakiety odpowiedziały na twoje żądanie jak mój przypadek, ponieważ używasz dekoratora uwierzytelniania i coś w tym rodzaju.
źródło