2011-01-23 233 views
8

當我執行POST表單時,Django 1.2一直給我這個CSRF驗證錯誤。我 「認爲」 我已經做了所有的Django的1.2文檔,即所要求的東西,Django 1.2.4 CSRF驗證失敗

  1. 確保MIDDLEWARE_CLASSES是包含在 'django.middleware.csrf.CsrfViewMiddleware'

  2. 確保{% csrf_token%}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. 使用RequestContext的在我的迴應

    def create(request): 
        if request.method == 'POST': 
         form = DefinitionForm(request.POST) 
         if form.is_valid(): 
          form.save() 
         c = {} 
         return render_to_response('dict/thanks.html',c, 
                context_instance=RequestContext(request)) 
        else: 
         form = DefinitionForm() 
        return render_to_response('dict/create_definition.html', { 
         'form' : form, 
        }) 
    

請注意GET操作在此函數中起作用。所以我想我正在使用render_to_response權利。

我甚至試圖拋出@csrf_protect裝飾器,即使這似乎並沒有工作。我沒有想法,我正要用我的筆記本電腦嗆自己。

你們能想到的任何事情嗎?

謝謝!

+0

檢查瀏覽器中的HTML以確保csrf標記字段在此處。然後轉儲POST響應以檢查它回到視圖。 – Spacedman 2011-01-23 17:06:57

回答

7

你不是#3。 RequestContext必須與顯示錶單的模板呈現一起使用。感謝頁面沒有必要。

return render_to_response('dict/create_definition.html', { 
    'form' : form, 
}, context_instance=RequestContext(request)) 

而作爲一個側面說明,你應該使用PRG pattern,而不是直接渲染感謝頁面。

+0

這是GET操作。如果再次查看代碼,那麼在request.method =='POST'時,我已經包含了該條件。 – Bryan 2011-01-23 17:10:58