Ich habe CSRF-Prozessor- und Middleware-Zeilen in auskommentiert 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 )
Wenn ich jedoch Ajax zum Senden einer Anfrage verwende, antwortet Django immer noch, dass das CSRF-Token falsch ist oder fehlt. Nach dem Hinzufügen von X-CSRFToken zu den Headern ist die Anfrage erfolgreich.
Was geht hier vor sich ?
Antworten:
Wenn Sie nur einige Ansichten benötigen, um CSRF nicht zu verwenden, können Sie Folgendes verwenden
@csrf_exempt
:Weitere Beispiele und andere Szenarien finden Sie in der Django-Dokumentation:
quelle
@csrf_exemp
funktioniert, wie ich es kürzlich ohne Probleme verwendet habe. Hoffe du findest die Antwort.Um CSRF für klassenbasierte Ansichten zu deaktivieren, hat Folgendes für mich funktioniert.
Verwenden von Django 1.10 und Python 3.5.2
quelle
In
setting.py
MIDDLEWARE können Sie diese Zeile einfach entfernen / kommentieren:quelle
Für Django 2 :
Diese Middleware muss gegebenenfalls hinzugefügt
settings.MIDDLEWARE
werden (z. B. in Ihren Testeinstellungen).Hinweis: Die Einstellung wird nicht mehr aufgerufen
MIDDLEWARE_CLASSES
.quelle
Die Antwort mag unangemessen sein, aber ich hoffe, sie hilft Ihnen
Eine solche Middleware hilft beim Debuggen von Anforderungen und beim Überprüfen von csrf auf Produktionsservern.
quelle
Das Problem hierbei ist, dass SessionAuthentication eine eigene CSRF-Validierung durchführt. Aus diesem Grund wird der CSRF-Fehler auch dann angezeigt, wenn die CSRF-Middleware kommentiert wird. Sie können jeder Ansicht @csrf_exempt hinzufügen. Wenn Sie jedoch CSRF deaktivieren und die Sitzungsauthentifizierung für die gesamte App durchführen möchten, können Sie eine zusätzliche Middleware wie diese hinzufügen.
Ich habe diese Klasse in myapp / middle.py erstellt. Dann importiere diese Middleware in Middleware in settings.py
Das funktioniert mit DRF auf Django 1.11
quelle
Wenn Sie es in Global deaktivieren möchten, können Sie eine benutzerdefinierte Middleware wie diese schreiben
Fügen Sie diese Klasse dann zuvor
youappname.middlewarefilename.DisableCsrfCheck
zuMIDDLEWARE_CLASSES
Listen hinzudjango.middleware.csrf.CsrfViewMiddleware
quelle
CSRF kann auf Ansichtsebene erzwungen werden und kann nicht global deaktiviert werden .
In einigen Fällen ist dies ein Schmerz, aber ähm, "es ist für die Sicherheit". Muss diese AAA-Ratings behalten.
https://docs.djangoproject.com/de/dev/ref/csrf/#contrib-and-reusable-apps
quelle
@WoooHaaaa Einige Pakete von Drittanbietern verwenden die Middleware 'django.middleware.csrf.CsrfViewMiddleware'. Zum Beispiel benutze ich django-rest-oauth und ich habe ein Problem wie Sie, auch nachdem ich diese Dinge deaktiviert habe. Vielleicht haben diese Pakete wie in meinem Fall auf Ihre Anfrage reagiert, weil Sie den Authentifizierungsdekorator und so etwas verwenden.
quelle