CSRF验证在requests.post()上失败

时间:2015-06-10 16:32:09

标签: python django

无法解决这个问题。 CSRF验证在我的所有Django模板视图中都能正常工作。在这里,我试图使用我在其他帖子中找到的技术从python客户端发帖。 client.get(url)调用确实提供了令牌(调试器显示,例如:client.cookies [' csrftoken'] =' POqMV69MUPzey0nyLmifBglFDfBGDuo9')但requests.post()失败错误403,CSRF验证失败。发生了什么事?

我的Django视图(方法中包含一些虚拟内容):

class CameraUpload(View):
    template_name = "account/templates/upload.html"

    def get(self, request):
        dummy = VideoForm()
        return render(request, self.template_name, {'form': dummy})

    def post(self, request):
        dummy = VideoForm()
        return render(request, self.template_name, {'form': dummy})

正在尝试发帖的客户:

import requests

url = 'http://127.0.0.1:8000/account/camera_upload/'

client = requests.session()
client.get(url)
csrftoken = client.cookies['csrftoken']

payload = {
    'csrfmiddlewaretoken': csrftoken,
    'tag': '69'
}

r = requests.post(url, data=payload)

编辑:

尝试按照this link添加引用,因此代码现在看起来像:

r = requests.post(url, data=payload, headers=dict(Referer=url))

但存在同样的问题。

1 个答案:

答案 0 :(得分:5)

您应该使用会话(client)作为帖子:

r = client.post(url, data=payload, headers=dict(Referer=url))