2016-10-04 2 views
3

Wenn ich mein Registrierungsformular in meiner Website verwenden wollte, erhalte ich ERROR 403: "CSRF-Überprüfung fehlgeschlagen. Anfrage abgebrochen." In der Quelle dieser Website habe ich festgestellt, dass das fehlt. Dies ist Teil der Ansicht-Quelle von meiner Website:Disappearing {% csrf_token%} auf Website-Datei

<div style="margin-left:35%;margin-right:35%;"> 
<fieldset> 
<legend> Wszystkie pola oprócz numeru telefonu należy wypełnić </legend> 
    <form method="post" action="."> 
     <p><label for="id_username">Login:</label> <input id="id_username" maxlength="30" name="username" type="text" required/></p> 
<p><label for="id_email">Email:</label> <input id="id_email" name="email" type="email" required /></p> 
<p><label for="id_password1">Hasło:</label> <input id="id_password1" name="password1" type="password" required /></p> 
<p><label for="id_password2">Powtórz hasło:</label> <input id="id_password2" name="password2" type="password" required /></p> 
<p><label for="id_phone">Telefon:</label> <input id="id_phone" maxlength="20" name="phone" type="text" /></p> 
<p><label for="id_log_on">Logowanie po rejestracji:</label><input id="id_log_on" name="log_on" type="checkbox" /></p> 
     <input type="submit" value="Rejestracja"><input type="reset" value="Wartości początkowe"> 
    </form> 
</fieldset> 
</div> 

Ich war davon überrascht, weil in meinen Dateien auf Pythonanythere dieses Fragment von Code vorhanden ist.

Dieser Teil meiner Datei register.html auf Pythonanythere ist:

<div style="margin-left:35%;margin-right:35%;"> 
<fieldset> 
<legend> Wszystkie pola oprócz numeru telefonu należy wypełnić </legend> 
    <form method="post" action=".">{% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" value="Rejestracja"><input type="reset" value="Wartości początkowe"> 
    </form> 
</fieldset> 
</div> 

Was mache ich falsch, dass meine Webseite nicht dieses Stück Code sehen? Es ist auf dem Server gesäumt, aber auf der Webseite View-Source Es ist nicht.

EDIT: Dies ist eine Ansicht, die meine Vorlage machen:

def register(request): 
    if request.method == 'POST': 
    form = FormularzRejestracji(request.POST) 
    if form.is_valid(): 
     user = User.objects.create_user(
      username=form.cleaned_data['username'], 
      password=form.cleaned_data['password1'], 
      email=form.cleaned_data['email'] 
     ) 
     user.last_name = form.cleaned_data['phone'] 
     user.save() 
     if form.cleaned_data['log_on']: 
      user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1']) 
      login(request, user) 
      template = get_template("osnowa_app/point_list.html") 
      variables = RequestContext(request, {'user': user}) 
      output = template.render(variables) 
      return HttpResponseRedirect("/") 
     else: 
      template = get_template("osnowa_app/register_success.html") 
      variables = RequestContext(request, {'username': form.cleaned_data['username']}) 
      output = template.render(variables) 
      return HttpResponse(output) 

else: 
    form = FormularzRejestracji() 
template = get_template("osnowa_app/register.html") 
form = FormularzRejestracji() 
variables = RequestContext(request, {'form': form}) 
output = template.render(variables) 
return HttpResponse(output) 
+0

Haben Sie den Server neu gestartet? –

+1

Können Sie die Ansicht anzeigen, die diese Vorlage rendert? – knbk

+0

Wird der SECRET_KEY in settings.py bei jedem Neustart des Servers generiert? –

Antwort

4

Sie sollten ein einfaches dict und das Anfrageobjekt an template.render(), nicht an RequestContext übergeben. Die Template-Engine wird es für Sie zu einem RequestContext konvertieren:

template = get_template("osnowa_app/register.html") 
context = {'form': form} 
output = template.render(context, request) 

Gerade jetzt, die template.render() Funktion sieht ein dict-ähnliches Objekt als erstes Argument, aber keinen Antrag als zweites Argument. Ohne eine Anfrage als zweites Argument wandelt es das dict-artige RequestContext in ein einfaches Context Objekt um. Da das Objekt Context keine Kontextprozessoren ausführt, fehlt Ihrem Kontext das csrf-Token.

Alternativ verwenden Sie können einfach die render shortcut, das eine HttpResponse Objekt mit dem gerenderten Vorlage als Inhalt zurückgibt:

from django.shortcuts import render 

def register(request): 
    ... 
    return render(request, "osnowa_app/register.html", {'form': form}) 

diesem speziellen Fall auch in ticket #27258 diskutiert wird.

+0

Es funktioniert! Vielen Dank. –

-2

CSRF-Token in HTML-Formular enthalten wird von hidden_tag Funktion auf dem Formular-Objekts aufrufen.

Zum Beispiel, überprüfen Sie diese gist, Zeile Nummer 6. So fügen Sie Formular und es Elemente in Jinja.

+0

Dies scheint keine Antwort auf die Frage zu sein. –

+0

Dies ist Django Vorlage Sprache, nicht Jinja2. ' {% csrf_token%} 'ist korrekt – knbk

Verwandte Themen