【问题标题】:CSRF verification fails on requests.post()CSRF 验证在 requests.post() 上失败
【发布时间】:2015-08-26 01:14:54
【问题描述】:

想不出来这个。 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))

但同样的问题存在。

【问题讨论】:

  • 你的网址中有一个额外的前言斜杠,也就是 /,你应该删除它
  • 那个斜线必须在那里。删除它会导致以下错误:“您通过 POST 调用此 URL,但 URL 没有以斜杠结尾,并且您设置了 APPEND_SLASH。Django 在维护 POST 数据时无法重定向到斜杠 URL...”
  • 那么下一个问题是你为什么要设置APPEND_SLASH?一个额外的斜线通常会把事情搞砸,尤其是在前端(javascript等)。但我想既然你有它作为设置它可以吗?虽然可能不是最佳做法。我猜测出了什么问题,每次您提出请求时,它都会设置一个 cookie / 证书,因此从上一个请求发送一个会弄乱下一个请求..但我不知道提供了什么..
  • 我想我在发布我的编辑之前错过了您的评论,但这是完全正确的。谢谢。

标签: python django


【解决方案1】:

您应该使用您的会话 (client) 来发帖:

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

【讨论】:

  • 谢谢!原来这正是我的问题
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 2012-09-08
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多