2016-10-04 1 views
3

私のサイトに自分の登録フォームを使用したいときは、「CSRF検証に失敗しました。要求が中止されました」というエラー403が表示されます。このウェブサイトのソースで、私はそれが欠けていることに気づいた。これは、自分のサイトからの眺めソースの一部です:Webサイトファイルの{%csrf_token%}が消えています

<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> 

Pythonanythereの私のファイルにコードのこの断片が存在しているので、私は、その驚きました。

これはPythonanythere上の私のファイルregister.htmlの一部である:私は私のウェブページには、コードのこの部分が表示されないことを間違って

<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> 

何をしているのですか?それはサーバー上で継ぎ目がついていますが、ウェブページのビューソース上にあります。

EDIT: これは私のテンプレートをレンダリングビュー、次のとおりです。

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

サーバーを再起動しましたか? –

+1

このテンプレートをレンダリングするビューを表示できますか? – knbk

+0

サーバを再起動するたびにsettings.pyのSECRET_KEYが生成されますか? –

答えて

4

普通のdictと要求オブジェクトをtemplate.render()に、RequestContextには渡す必要があります。テンプレートエンジンはあなたのためにRequestContextに変換します:

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

は今、 template.render()関数は第一引数に辞書のようなオブジェクトが、2番目の引数として要求なしを見ています。第2引数として要求がなければ、dict-likeを RequestContextのように平文 Contextオブジェクトに変換します。 Contextオブジェクトはコンテキストプロセッサを実行しないため、コンテキストにcsrfトークンがありません。

別の方法としては、単にコンテンツとしてレンダリングテンプレートとHttpResponseオブジェクトを返すrender shortcutを、使用することができる:

from django.shortcuts import render 

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

この特定の場合もticket #27258で議論されています。

+0

ありがとうございます。 –

-2

CSRFトークンは、フォームオブジェクトのhidden_tag関数を呼び出すことによって、HTMLフォームに含まれます。

たとえば、gistの行番号6を確認します。フォームとその要素をjinjaに追加する方法です。

+0

これは質問に対する答えとは思われません –

+0

これはJinja2ではなくDjangoのテンプレート言語です。 {%csrf_token%} 'は正しいです。 – knbk

関連する問題