Persistent "CSRF-token fehlen oder falsch sind.". Jinja und django-registration-setup
Erhalte ich diese Meldung:
CSRF-token fehlen oder falsch sind.
In den meisten Foren, die sagen, Sie bekommen die {% csrf_token %} in der form, und ich habe es.
Auch ich habe in meinem settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.csrf",
"django.contrib.auth.context_processors.auth",
)
Ich bin mit jinja, die nicht scheinen, um zu verwenden, CSRF, aber dann habe ich installiert django Registrierung und ich habe verloren, da es zu sein scheint, verwenden einige andere Aussicht, dass ich keinen Zugriff habe, um so zu sagen, Sie sind nicht von mir geschrieben, und ich kann nicht herausfinden, wo Sie sind. "standard-auth-views" wie Sie Sie nennen. Also ich bin nicht in der Lage, um hinzuzufügen, "RequestContext".
Irgendwelche Ideen was Los ist und wie ich es bekommen kann gehen? danke
- was macht Ihr template Aussehen?
- {% extends "site_base.html" %} {% block body %} <form method="post" action="/Account/login/"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="Absenden" /> <input type="hidden" name="weiter" value="{{ next }}" /> </form> {% endblock body %}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie vielleicht, zu schreiben, die django-registration-Ansicht manuell. Sieht aus wie es eine Problem mit, wie Jinja liebt es, Dinge zu tun, und wie Django will zum konfigurieren der Vorlage-Lader..
Blick auf die standard-auth Ansichten, schauen Sie einfach unter "site-packages" in Ihrer python-installation.
Könnten Sie versuchen, die Verpackung der standard-auth Ansichten wie diese:
Ich grundsätzlich importiert Django ' s standard auth Ansichten und hieß Sie mit meiner eigenen, die haben die csrf_protect Dekoration. Es ist einen Versuch Wert.
Haben Sie auch die standard-Django Templating-system installiert? Benötigt werden für die meisten Anwendungen, die verteilt sind mit Vorlagen.
Für CSRF, einen Kontext-Prozessor fügt die variable 'csrf_token' in der Antwort Kontext, ruft es von der middleware ab, wenn aktiviert. Alles was Sie jetzt noch tun müssen, ist sicherzustellen, dass es abgesehen von Ihrer form.
Dieser ist gerade aus django.Kern und unterliegen jederzeit ändern.
Jedoch, zu sehen, dass, alles, was Sie wirklich wissen müssen ist, dass Sie haben, um ein input-Typ mit dem Namen csrfmiddlewaretoken mit dem Wert von Kontext.get('csrf_token',") in Ihrem Formular und das ist alles, schrieb Sie.
{% csrf_token %}
Kontext-Prozessor für diesen Zweck. Wenn Sie mit einer anderen Template-Sprache, die Sie benötigen, um sicherzustellen, dass der html-code oben ist enthalten in jeder form nach Ihren Vorlagen.Diese Antwort ist nicht spezifisch für django-registration, sondern nur mit Django mit Jinja2 im Allgemeinen.
Django ' s CsrfViewMiddleware legt die csrf_token cookie, wenn er feststellt, dass Sie Zugriff auf die csrf_token Kontext-Mitglied. Leider Jinja2 rendering nicht auftreten, bis nach Django middleware ausgeführt wird. Als ein Ergebnis, wird der cookie nicht gesetzt ist, und daher nicht mit der form, und Sie erhalten die 403-Fehler.
Zu bekommen um dieses Problem zu beheben, benötigen Sie Zugriff auf context['csrf_token'] an einem gewissen Punkt, bevor Sie mit der Bearbeitung fertig die Antwort.
Wenn Sie mit class-based-views, können Sie eine CsrfProtectMixin:
Und dann in Ihrer view-Klasse:
Wenn du nicht mit class-based-views, die Sie tun können, so etwas wie:
Oder vielleicht monkey patch render_to_reponse mit der Logik in der Klasse vor.
Die einfachste Antwort auf diese ist man gerade legen {% csrf_token %} innerhalb des form-tag in Ihr template - /html.
Ich nur ausgeschaltet csrf middleware in die Einstellungen gerne so, und jetzt funktioniert es: