Forbidden (403) CSRF-überprüfung ist fehlgeschlagen. Anfrage abgebrochen
Ich versuche eine app mit login-Formular, aber wenn ich auf meine app und klicken Sie auf login-button wird der folgende Fehler auftreten
Forbidden (403)
CSRF-überprüfung ist fehlgeschlagen. Anfrage abgebrochen.
den code von view.py ist wie:
from django.template import loader
from django.shortcuts import render_to_response
from registration.models import Registration
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import redirect
def view_login(request,registration_id):
t = loader.get_template('registration/login.html')
try:
registration=Registration.objects.get(pk=registration_id)
except Registration.DoesNotExist:
return render_to_response("login.html",{"registration_id":registration_id})
def home(request,registration_id):
if request.method == "POST":
username = request.POST.get('user_name')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# success
return render('registration/main_page.html',{'registration_id':registration_id},context_instance=RequestContext(user))
else:
#user was not active
return redirect('q/',context_instance=RequestContext(user))
else:
# not a valid user
return redirect('q/',context_instance=RequestContext(user))
else:
# URL was accessed directly
return redirect('q/',context_instance=RequestContext(user))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
{% csrf_token %}
in Ihrer formhttps://docs.djangoproject.com/en/2.2/ref/csrf/
so :
Auch, Sie haben die Verwendung von RequestContext(request) everytime, das Sie verwenden
render_to_response
:Und Sie importieren die Authentifizierung und Anmeldung :
return render('registration/main_page.html',{'registration_id':registration_id},context_instance=RequestContext(user))
Richtig??????Ich begegnet diesem problem, während Sie mit dem Buch "The Definitive Guide to Django" in der version 1.1 verwendet. Das Buch befasst sich nicht mit der Notwendigkeit für csrf_token Prüfung, die beauftragt ist, in späteren Versionen.
Um dieses Problem zu beheben, fügen Sie hinzu:
den views.py Datei und diesem zusätzlichen argument für die render_to_response Funktion:
Werden Sie sicher, dass Sie
{% csrf_token %}
innerhalb der<form>
- tags in der VorlageNur Kommentar
'django.middleware.csrf.CsrfViewMiddleware'
in Ihrem settings.py, die für mich funktioniert:
DIES KANN SICHERHEITSLÜCKEN HABEN, ES SEI DENN, SIE ES IRGENDWIE SCHAFFEN, CSRF IN EINER ANDEREN ART UND WEISE, UND WIRD NICHT EMPFOHLEN, DA SIE SUSCEPTIABLE, UM CSRF-ANGRIFFE
Wenn du "Forbidden (403) CSRF-überprüfung ist fehlgeschlagen. Anfrage abgebrochen", können Sie alternativ tun:
option (2) (nicht bevorzugt)
import:
hinzufügen Kontext:
zurück:
-Django > 1.9 hat "Kontext" - statt "context_instance"
option (3) (bevorzugt)
import:
-anstatt Sie zu importieren "render_to_response" importieren "render"
zurück:
Offenbar die Variante 3 bevorzugt, da das "Rendern" ist kürzer als "render_to_response", vor allem, wenn Sie brauchen, um zu importieren und Dinge hinzufügen. Ich könnte mir vorstellen, option 2 hält einen schlankeren Rahmen dict, aber dies scheint trivial (?).
Für Klarheit:
Beide Lösungen müssen noch die {% csrf_token %} in deine html-Formular, wie oben erwähnt. Und nie ausschalten oder kommentieren Sie die csrf-middelware.
Quellen:
alte Django 1.9 docs auf RequestContext
Django 2 docs auf der csrf-Prozessor
Quelle erklären Rendern ist genug