2014-06-19 171 views
1

我正在寫一個Ajax後用python的請求的圖書館Django的後端Django的拒絕請求CSRF令牌

代碼:

import requests 
import json 
import sys 

URL = 'http://localhost:8000/' 

client = requests.session() 

client.get(URL) 

csrftoken = client.cookies['csrftoken'] 


data = { 'file': "print \"It works!\"", 'fileName' : "JSONtest", 'fileExt':".py",'eDays':'99','eHours':'1', 'eMinutes':'1' } 
headers = {'Content-type': 'application/json', "X-CSRFToken":csrftoken} 
r = requests.post(URL+"au", data=json.dumps(data), headers=headers) 

的Django給了我一個403錯誤,指出CSRF令牌ISN」 t設置即使request.META從csrf_failure()顯示它已設置。有什麼我失蹤或我不捕捉一個愚蠢的錯誤?

回答

3

我問我的朋友,他想通了問題,基本上你必須發送django在每次請求時給你的cookies。

更正:

cookies = dict(client.cookies) 
r = requests.post(URL+"au", data=json.dumps(data), headers=headers,cookies=cookies) 
0

您需要引薦傳遞到頭部,從Django文檔:

此外,HTTPS請求,嚴格引薦檢查由 CsrfViewMiddleware完成。由於HTTP'Set-Cookie'標頭爲 (不幸地)被客戶端接受,因此在使用與會話無關的 隨機數時,這對於解決在HTTPS下可能發生的中間人攻擊 是必要的。與網址爲 的HTTPS進行通話。 (Referer的檢查不爲HTTP請求完成,因爲 存在的Referer標頭是不是在HTTP下足夠可靠。)

所以改變這樣的:

headers = {'Content-type': 'application/json', "X-CSRFToken":csrftoken, "Referer": URL} 
+0

我說行,遺憾的是它仍然無法正常工作。它仍然給我「CSRF cookie未設置」。錯誤。 –

+0

您是否更改CSRF_COOKIE_SECURE設置? https://docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-secure – fasouto

+0

也嘗試更改'X-CSRFToken'的'csrfmiddlewaretoken' – fasouto