2016-10-04 16 views
3

當我想在我的網站中使用我的註冊表單時,出現錯誤403:「CSRF驗證失敗,請求中止。」在本網站的來源中,我意識到這一點缺失。這是從我的網站查看源代碼的一部分:網站文件中消失{%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> 

什麼我做錯了,我的網頁上沒有看到這一段代碼?它在服務器上進行了裁剪,但在網頁上查看源代碼卻不是。

編輯: 這是視圖,它使我的模板:

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

您應該傳遞一個普通的字典和請求對象到template.render(),而不是RequestContext。模板引擎將其轉換爲RequestContext你:

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

眼下,template.render()功能看到一個類似字典的對象作爲第一個參數,但作爲第二個參數沒有任何要求。沒有請求作爲第二個參數,它將字典RequestContext轉換爲普通的Context對象。由於Context對象不運行上下文處理器,因此您的上下文缺少csrf令牌。

或者你可以只使用render shortcut,它返回一個HttpResponse對象與渲染的模板內容:

from django.shortcuts import render 

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

這種特殊情況下,也正在討論ticket #27258

+0

It works!Thank You。 –

-2

CSRF令牌被包含在HTML表單通過調用表單對象上hidden_tag功能。

例如,檢查這個gist,第6行。這是你如何添加表單,它是在jinja中的元素。

+0

這似乎不是一個問題的答案 –

+0

這是Django模板語言,而不是Jinja2。' {%csrf_token%}'是正確的。 – knbk