Django Rest Framework entfernt csrf
Ich weiß, dass es Antworten im Hinblick auf Django Rest Framework, aber ich konnte nicht finden eine Lösung für mein problem.
Ich habe eine Anwendung die Authentifizierung und einige Funktionen.
Ich habe eine neue app, die verwendet Django Rest Framework. Ich will die Benutzung der Bibliothek ist nur in dieser app. Auch ich möchte POST-Anfrage, und ich immer diese Antwort erhalten:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
Ich habe den folgenden code:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
Möchte ich hinzufügen, die API, ohne die aktuelle Anwendung.
Also meine Frage ist wie kann ich das deaktivieren CSRF-nur für diese app ?
InformationsquelleAutor der Frage Irene Texas | 2015-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum dieser Fehler passiert ist?
Dies ist passiert, weil der Standard
SessionAuthentication
Regelung, die durch die DRF. DRF istSessionAuthentication
verwendet Djangos session framework für die Authentifizierung erfordert CSRF-Angriffe überprüft werden.Wenn Sie nicht definieren, jeder
authentication_classes
Ihrer Ansicht/viewset, DRF verwendet diese Authentifizierung Klassen als Standard.Seit DRF unterstützt sowohl das session und nicht-session-basierte Authentifizierung die gleichen Ansichten, es erzwingt CSRF check für nur authentifizierte Benutzer. Dies bedeutet, dass nur authentifizierte Anfragen erfordern eine CSRF-Token und anonyme Anfragen können gesendet werden, ohne CSRF-Token.
Wenn Sie eine AJAX-Stil-API mit SessionAuthentication, Sie müssen ein gültiges CSRF-token für jedes "unsichere" HTTP-Methode aufrufen, wie
PUT, PATCH, POST or DELETE
Anfragen.Was dann zu tun?
Nun zu deaktivieren, csrf check, erstellen Sie eine benutzerdefinierte Authentifizierung-Klasse
CsrfExemptSessionAuthentication
die sich von der Standard -SessionAuthentication
Klasse. In dieser Authentifizierung Klasse, wir werden überschreiben dieenforce_csrf()
überprüfen, was geschehen war, innerhalb der eigentlichenSessionAuthentication
.In Ihrem Blick, dann definieren Sie die
authentication_classes
werden:Diese behandeln soll, der csrf-Fehler.
InformationsquelleAutor der Antwort Rahul Gupta
Einfachere Lösung:
In views.py verwenden Sie Klammern CsrfExemptMixin und authentication_classes:
InformationsquelleAutor der Antwort bixente57
Wenn Sie nicht möchten, zu verwenden session-basierte Authentifizierung verwenden, können Sie entfernen
Session Authentication
aus REST_AUTHENTICATION_CLASSES und das würde automatisch entfernen Sie alle csrf-basierten Fragen. Aber in diesem Fall Können apis möglicherweise nicht funktionieren.Neben dieser Fehler sollte uns nicht noch mit session-Authentifizierung. Sollten Sie die benutzerdefinierte Authentifizierung verwenden, wie TokenAuthentication für Ihre apis und stellen Sie sicher, senden
Accept:application/json
undContent-Type:application/json
(vorausgesetzt, Sie sind mit json) in Ihre Anträge zusammen mit Authentifizierungs-token.InformationsquelleAutor der Antwort hspandher
Für alle, die nicht das finden eine hilfreiche Antwort. Ja DRF entfernt automatisch CSRF-Schutz, wenn Sie nicht verwenden
SessionAuthentication
AUTHENTIFIZIERUNG-KLASSE, zum Beispiel, viele Entwickler verwenden Sie nur JWT:Aber Problem
CSRF not set
werden kann, aufgetreten ist, aus irgendeinem anderen Grund, für exmple Sie nicht korrekt Hinzugefügt Weg, um Sie anzuzeigen:statt
InformationsquelleAutor der Antwort user3479125
Ich bin geschlagen mit dem gleichen problem. Ich folgte diesem Referenz und es funktionierte.
Lösung ist die Erstellung einer middleware
Hinzufügen disable.py Datei in eine Ihrer apps (in meinem Fall ist es 'myapp')
Und fügen Sie den middileware der MIDDLEWARE_CLASSES
InformationsquelleAutor der Antwort Venkatesh Mondi
Wenn Sie eine exklusive virtuelle Umgebung für Ihre Applikation, können Sie verwenden Sie den folgenden Ansatz ohne wirksame andere Anwendungen.
Was du beobachtet hast, passiert da
rest_framework/authentication.py
hat Sie diesen code inauthenticate
Methode derSessionAuthentication
Klasse:Können Sie ändern Sie die
Request
Klasse eine Eigenschaft namenscsrf_exempt
und initialisieren Sie innerhalb Ihrer jeweiligen View-KlasseTrue
wenn Sie nicht möchten, CSRF überprüft. Zum Beispiel:Als Nächstes modifizieren Sie den obigen code wie folgt:
Gibt es einige relevante änderungen, die Sie würde tun müssen, es in der
Request
Klasse. Eine vollständige Implementierung finden Sie hier (mit vollständiger Beschreibung): https://github.com/piaxis/django-rest-framework/commit/1bdb872bac5345202e2f58728d0e7fad70dfd7edInformationsquelleAutor der Antwort Reetesh Ranjan