Django拒绝Requests的CSRF令牌

时间:2014-06-19 20:58:16

标签: python django csrf python-requests

我正在将一个带有python的Request库的Ajax帖子写入django后端

代码:

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_failure()的request.META显示已设置,也未设置CSRF令牌。有什么我想念的东西或者我没有抓到的一个愚蠢的错误吗?

2 个答案:

答案 0 :(得分:3)

我问我的朋友,他发现了问题,基本上你每次发出请求时都要发送django给你的cookies。

校正:

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

答案 1 :(得分:0)

您需要将引用传递给django docs:

中的标题
  

此外,对于HTTPS请求,严格的引用检查由   CsrfViewMiddleware。这对于解决中间人问题是必要的   使用独立会话时在HTTPS下可能发生的攻击   nonce,因为HTTP'Set-Cookie'标题是   (不幸的是)被正在与网站交谈的客户接受   HTTPS。 (没有为HTTP请求进行引用检查,因为   在HTTP下,Referer头的存在不够可靠。)

所以改变这个:

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