2012-03-27 50 views
1

我使用jQuery來做一個AJAX POST,但得到一個CSRF錯誤。我認爲這是因爲CSRF cookie不會發送給客戶端發回。有沒有一種方法可以在Django 1.0中解決這個問題?如何在沒有跨站點請求僞造錯誤的情況下在Django 1.0中執行AJAX POST?

+3

手動添加令牌到ajax post參數 - 這是最簡單的方法。我忘記了1.0的令牌生成函數的確切位置(從1.0開始,csrf已經移動了很多),但它不應該很難找到!例如在1.3中,RequestContext自動具有一個名爲'csrf_token'的變量,它是標記字符串(不要與標記混淆)。 – 2012-03-28 00:17:04

+0

[Django CSRF檢查與Ajax POST請求失敗]的可能重複(http://stackoverflow.com/questions/5100539/django-csrf-check-failing-with-an-ajax-post-request) – 2012-03-28 06:14:28

+0

這可以'是Django 1.0,它沒有CSRF保護。 – 2012-03-28 06:52:37

回答

1

Yuji的建議指出了我的正確方向。

我正在做一個視圖的AJAX POST,這是一個GET的結果,因此Django中間件沒有生成任何csrf標記。

我使用在csrf中間件(/usr/lib/python2.5/site-packages/django/contrib/csrf/middleware.py)中找到的代碼來生成一個csrf標記,並使用GET上下文發送它。現在,由於令牌存在,AJAX POST正常工作。

要創建CSRF令牌:

def csrf_token_create(request): 

    from django.contrib.csrf.middleware import _make_token  

    try: 
     session_id = request.COOKIES[settings.SESSION_COOKIE_NAME] 
    except KeyError: 
     # No session, no check required 
     return None 

    csrf_token = _make_token(session_id) 
    return csrf_token 

在視圖上下文:

csrf_token = csrf_token_create(request) 
return render_to_response('view.html', {'csrfmiddlewaretoken': csrf_token}) 

添加一個隱藏的輸入csrfmiddlewaretoken在HTML模板。

+0

如果可以,請接受此爲正確答案。如果您有任何代碼可能對將來的人有用,那麼您應該編輯您的帖子並將其包含在內,如果可以的話:) – 2012-03-28 01:57:15

+0

我已經添加了代碼。 – Mitch 2012-03-29 00:45:57

0

django 1.4的文檔有你的代碼。 https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/

我可能認爲這也適用於django 1.0,因爲你要做的代碼基本上只是將jquery函數添加到您的頁面加載的任何js文件。 對於1.4版本,我們必須在django模板中的表單元素內添加{%csrf_token%}標籤。試試這個吧!

相關問題