wake-up-neo.com

CSRF-Token fehlt oder ist falsch

Anfänger bei Django hier, ich habe schon lange versucht, das Problem zu beheben ... Ich habe 'Django.middleware.csrf.CsrfViewMiddleware' in meinen Middleware-Klassen und das Token in meinem Post-Formular.

Hier ist mein Code, was mache ich falsch?

from Django.contrib.auth.forms import UserCreationForm
from Django.shortcuts import render_to_response
from Django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from Django.template import RequestContext
from Django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

Hier ist meine Vorlage:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}
18
arooo

Meine Vermutung ist, dass Sie das Tag in der Vorlage haben, aber es wird nichts gerendert (oder meinten Sie damit, dass Sie im tatsächlichen HTML-Code bestätigt haben, dass ein CSRF-Token generiert wird?)

Verwenden Sie entweder RequestContext anstelle eines Wörterbuchs

render_to_response("foo.html", RequestContext(request, {}))

Oder stellen Sie sicher, dass Sie Django.core.context_processors.csrf in Ihrer CONTEXT_PROCESSORS-Einstellung haben.

https://docs.djangoproject.com/de/dev/ref/contrib/csrf/

Oder füge das Token manuell zu deinem Kontext hinzu

22

Fügen Sie dies einfach zu Ihren Ansichten hinzu

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

Es wird klappen!!

5
Njogu Mbau

Versuchen Sie es mit render anstelle von render_to_response

from Django.shortcuts import render

render(request, "foo.html", {})

Django - Was ist der Unterschied zwischen render (), render_to_response () und direct_to_template ()?

Wie im obigen Link angegeben, wurde es in Django 1.3 eingeführt und verwendet automatisch RequestContext.

4
Kamen Tsvetkov

Der Zusatz von RequestContext ist der Schlüssel bei der Verwendung von render_to_response, wie von @Yuji 'Tomita', Tomita und @Njogu Mbau erwähnt. Was mich anfangs jedoch abwarf, als ich mit diesem Problem zu kämpfen hatte, war, dass ich RequestContext sowohl zu der Funktion in views.py hinzufügen musste, die die Vorlage zunächst lädt, als auch zu der Funktion in views.py, die die Übergabe aus der Vorlage abwickelt.

Hier finden Sie einige weitere Links, die dasselbe Problem behandeln

0
wingr

Wenn Sie CsrfViewMiddleware nicht verwenden, müssen Sie csrf_protect für alle Ansichten verwenden, die das Vorlagetag csrf_token verwenden, sowie für diejenigen, die die POST - Daten akzeptieren.

0
Neeraj Sharma

Dieser Fehler wurde auch auf einigen Seiten nach der Installation des Django-Livereload-Servers zufällig generiert. Der Deinstallation des Django-Livereload-Servers gelang der Trick.

0
lukeaus