2011-11-11 162 views
15

Django初學者在這裏,我一直試圖解決這個很長一段時間。 我在我的中間件類中有'django.middleware.csrf.CsrfViewMiddleware',並且在我的表單中有確實的標記。CSRF令牌缺失或不正確

繼承人我的代碼,我做錯了什麼?

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, },) 

這裏是我的模板:

{% block content %} 

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

{% endblock %} 
+0

的可能重複註釋掉下面的行[Django的:CSRF令牌丟失或不正確(http://stackoverflow.com/questions/8321217/ django-csrf-token-missing-or-incorrect) – lracicot

回答

21

我的猜測是,你必須在模板中的標籤,但它沒有渲染任何東西(或你的意思是你在實際HTML,一個CSRF令牌確認產生?)

要麼使用RequestContext代替字典

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

或確保您的django.core.context_processors.csrf在您的CONTEXT_PROCESSORS設置中。

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

Or add the token to your context manually

+0

這樣做!我完全理解它仍然有點麻煩,但至少我過去茫然地看着,試圖隨機改變事情。這些文檔對我沒有太大的幫助,非常感謝! – arooo

+0

這是文檔中的第3步:)如果你讓自己挖一點點,Django的文檔是驚人的。祝你好運! –

+0

非常感謝,這解決了我的問題。對每個人的一般建議:檢查用戶render_to_response()與正確的參數,我搞砸了,給它3個參數,因此它導致了上述錯誤。 – Phonebox

5

只需添加到您的意見

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

它將工作!

0

如果您不使用CsrfViewMiddleware,那麼您必須在任何使用csrf_token模板標記的視圖以及接受POST數據的視圖上使用csrf_protect。

0

如@Yuji'Tomita'Tomita和@Njogu Mbau所述,RequestContext的使用是使用render_to_response的關鍵。然而,當我遇到這個問題時,最初拋棄我的是,我必須將RequestContext添加到views.py中的函數中,該函數最初將模板加載到處理從模板提交的views.py中的函數中。

此外,僅供參考,這裏是討論這個同樣的問題,其他一些鏈接

0

在我安裝了django-livereload-server之後,在一些頁面上也隨機得到了這個錯誤。卸載django-livereload-server的確有竅門。

-1

什麼工作對我來說是從我settings.py

'django.middleware.csrf.CsrfViewMiddleware'

相關問題