2012-08-16 57 views
0

你好,我是一個新手試圖使用Django來註冊一些用戶,我一直在閱讀Django的書和我一本關於註冊章,http://www.djangobook.com/en/2.0/chapter14/當我做了說明我得到這個Django的書過時CSRF保護

禁止(403)

CSRF驗證失敗。請求中止。對未給予 幫助

原因:

CSRF token missing or incorrect. 

在一般情況下,當有一個真正的跨站請求僞造,或當Django的CSRF機制尚未正確使用可能發生這種情況。對於POST表單,您需要確保:

Your browser is accepting cookies. 
The view function uses RequestContext for the template, instead of Context. 
In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL. 
If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data. 

你會看到這個頁面的幫助部分,因爲你有DEBUG =真在你的Django設置文件。將其更改爲False,並且只顯示最初的錯誤消息。

您可以使用CSRF_FAILURE_VIEW設置來自定義此頁面。

我把{%csrf_token%}模板標籤放在的post標籤中,它仍然給我這個錯誤。感謝

# views.py 
# 
# Copyright 2012 Talisman <[email protected]> 
from django.shortcuts import render_to_response 
from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from django.http import HttpResponseRedirect 

def home (request): 
    return render_to_response('FirstTemplate.html',) 

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form = UserCreationForm() 
    return render_to_response("register.html", { 
     'form': form, 
    }) 

形式

{% extends "base.html" %} 

{% block title %}Create an account{% endblock %} 

{% block content %} 
    <h1>Create an account</h1> 

    <form action="" method="post"{% csrf_token %}> 
     {{ form.as_p }} 
     <input type="submit" value="Create the account"> 
    </form> 
{% endblock %} 
+0

{%csrf_token%}是後

..所以 {%csrf_token%} {{form.as_p}},因爲它renderes 標記 – 2012-08-16 19:03:41

回答

1

Djangobook使用很老版本的Django的,你可能會在一個較新的版本,我已經嘗試過的信息和csrf部分肯定是過時的sinc Ë他們有一些修改,這是在新版本中的處理方式,與書的版本,也有一些常見的原因造成的錯誤(除了由pahko提到中間件的事情)符合您的Django版本是

  1. 不使用csrf_token標籤模板
  2. 沒有使用的RequestContext類 - 有RequestContext的
  3. 替換上下文

這樣

from django.template import RequestContext 

一nd在呈現語句中

return render_to_response("home/index.html", c, context_instance=RequestContext(request)) 

注意:在上面的語句中使用您自己的模板路徑。

+0

看起來它獲得了csrf標記,但我不確定,因爲我得到了另一個渲染到響應對象的錯誤。我該怎麼做,所以有'形式':表格, 沒有全球名稱錯誤。另外,我不想降級,但必須有一種方法,或者是否有任何其他教程用於簡單註冊。我在我自己的電腦上,所以我不認爲我可以做電子郵件驗證。上述代碼中的 – Klanestro 2012-08-16 19:53:52

+0

c(render_to_response函數的第二個參數)是一個包含要傳遞的信息的字典。 – 2012-08-16 20:36:31

0

嘗試把這個在你的中間件配置settings.py中

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
) 

希望它有助於

+0

已經有它在那裏由於雖然 – Klanestro 2012-08-16 18:29:52

+1

你可以請發佈您使用的代碼..我的意思是您的表單和視圖..謝謝 – pahko 2012-08-16 18:32:20

+0

也鏈接到Django書中的頁面... – pahko 2012-08-16 18:32:49