我正在将一个带有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令牌。有什么我想念的东西或者我没有抓到的一个愚蠢的错误吗?
答案 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}