2010-09-20 36 views
1

我有一個與Django服務器端一起工作的GWT web應用程序。我最近將Django升級到了1.2,並且無法從我的GWT應用程序獲取HTTP帖子。我收到此錯誤:Django 1.2來自Google Web Toolkit的CSRF和HTTP帖子

CSRF verification failed. Request aborted.

Reason given for failure:

CSRF token missing or incorrect. 

我已經啓用了CSRF中間件(「django.middleware.csrf.CsrfViewMiddleware」,「django.middleware.csrf.CsrfResponseMiddleware」),這是工作的contrib應用程序,如登錄,但似乎令牌沒有被添加到通過GWT創建的帖子中。有任何想法嗎?提前致謝。

回答

0

如果您已經檢查了auth.login的模板,您會注意到<form>標記中明確包含CSRF標記。

<form method="post" action="."> 
    {% csrf_token %} 

當頁面在GET請求上呈現時,這被擴展爲隱藏字段。喜歡的東西:

<form method="post" action="."> 
    <div style='display:none'> 
     <input type='hidden' name='csrfmiddlewaretoken' 
      value='90064bf0e86edacfdb60595e3e2b8f23' /> 
    </div> 

然後此令牌傳遞迴視圖POST和驗證。

因此,在您可以將POST轉換爲CSRF保護視圖之前,您必須首先從上述視圖中獲取令牌。

您可以在向視圖發出POST請求之前驗證/確保您擁有CSRF令牌嗎?或者,您可以使用csrf_exempt裝飾器禁用該視圖的CSRF保護。這可能不是一個好主意。

更新

This is the point of my question: I am not using django templates for my front-end and thus I cannot tag forms with the token. I am using GWT for my front-end, which is rendering the form for the post.

您是否已經渲染頁面之前作出GET請求Django的看法?在這種情況下,您可以通過解析響應的內容來獲取CSRF令牌。

如果沒有,您將不得不明確地向視圖發出GET請求(假設它支持GET)並解析CSRF令牌的響應。有關示例,請參閱this question

+0

這是我的問題的重點:我*不*使用django模板爲我的前端,因此我不能標記形式的標記。我正在爲我的前端使用GWT,它正在爲該帖子渲染表單。 – Neil 2010-09-20 06:37:45

+0

@NP:更新了我的答案。往上看。 – 2010-09-20 06:54:46