2011-11-05 107 views
3

我想在Django中不使用表單元素的情況下發送一個ajax請求(通過Jquery,儘管我認爲這種情況無關緊要)。根據documentation,我應該可以通過使用ensure_csrf_cookie修飾器來實現,但是,我得到了Error was: cannot import name ensure_csrf_cookie在沒有表單元素的情況下在Django中使用ajax請求

我正在使用以下導入from django.views.decorators.csrf import ensure_csrf_cookie

我沒有找到關於ensure_csrf_cookie的大量文檔,所以任何幫助將不勝感激。

順便說一句,使用@csrf_exempt按預期工作。

在此先感謝。

回答

6

ensure_csrf_cookie如果您在導入時遇到問題,可能只能使用1.4 alpha功能 - 我可以在主幹上使用相同的語句導入它。

這裏最簡單的解決方案是在ajax調用中傳遞csrf_token VALUE。

你說你使用的是jQuery。

$.ajax({ 
     url: "", 
     type: 'POST', 
     data: { 
      csrfmiddlewaretoken: '{{ csrf_token }}' // just the token value 
     }, 
     success: function(response) { 
     } 
    }) 

看來這ensure_csrf_cookie強制視圖設置將需要使用自動基於Cookie的CSRF保護機制,這裏所描述的jQuery AJAX調用CSRF餅乾:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

+0

我不知道'ensure_csrf_cookie'是一個1.4 alpha版本。這就是爲什麼我得到導入錯誤(我正在運行1.3)。至於你的建議,我的JavaScript沒有嵌入到我的模板中,所以{{csrf_token}}不會替代實際的標記。你有解決這個問題的方法嗎? –

+0

是的,在這裏實現jQuery函數:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax其中一個cookie放在客戶端瀏覽器上並帶有csrf_token。它應該在大多數情況下沒有這個新的1.4功能? –

+0

太好了。我對使用這種方法有點猶豫,因爲它看起來很醜,但效果很好。順便說一下,我是否應該避免使用'csrf_exempt',或者在使用ensure_csrf_cookie或剛纔建議的選項時存在缺陷(安全方面)? –

1

你是對的 - 這似乎是文檔中的一個錯誤。您應該可以使用csrf_exempt(相同的文檔頁面)。

+0

如果ensure_csrf_cookie是1.4阿爾法功能(如Yuji建議),那麼文檔只需要澄清這一點。是的,csrf_except可以工作,但ensure_csrf_cookie看起來更適合這項工作。 –

+0

是的,這不是在1.3的文檔:https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#page-uses-ajax-without-any-html-form –

+0

的確。/dev/vs /1.3/。我應該更仔細一點。 –

相關問題