【问题标题】:Django: How to return a raw responseDjango:如何返回原始响应
【发布时间】:2011-12-18 15:30:50
【问题描述】:

这就是我想要的。

  1. 向外部站点提交 POST 请求(即登录信息)。
  2. 接收响应
  3. 将原始响应返回到我的客户端浏览器(包含用于登录的 cookie
    验证)。
  4. 如果客户尝试在新标签页中访问该网站,他会发现自己已经登录。

我成功完成了第 1 步和第 2 步(提交了 POST 并收到了网站的回复)。

request = urllib2.Request(url, formData, headers)
response = urllib2.urlopen(request)

但是当我尝试在视图中返回它时

return response

我收到以下错误

Django Version:     1.3.1
Exception Type:     AttributeError
Exception Value:    addinfourl instance has no attribute 'has_header'
Exception Location:D:\Python27\lib\site-packages\django\utils\cache.py in patch_vary_headers

注意: 我之前有一个 csrf 错误,但是我使用装饰器 @csrf_exempt 禁用了 csrf 并且错误消失了

【问题讨论】:

  • 所以换句话说,你想执行一个中间人攻击。
  • 我是上述外部网站的授权用户。我只是无法访问他们的代码。
  • 可以理解。但原理是一样的。如果您的“解决方案”涉及与安全漏洞相同的想法,那可能不是一个好主意。

标签: django response urllib2


【解决方案1】:

首先,在视图中提交 URL 请求作为响应是没有意义的。但是,即使你可以,那也不会达到你想要的效果。没有办法让用户登录到不同的站点,原因很明显:这将是一个巨大的安全漏洞。

【讨论】:

    【解决方案2】:

    您不应该直接从 urlopen 方法返回 response。相反,您的视图应该返回 django 的 HttpResponse 的实例,其中正文和标题应设置为原始响应中的那些:

    from django.http import HttpResponse
    import urllib2
    
    def my_view(request):
        request = urllib2.Request(url, formData, headers)
        response = urllib2.urlopen(request)
    
        # set the body
        r = HttpResponse(response.read())
    
        # set the headers
        for header in response.info().keys():
            r[header] = response.info()[header]
    
        return r
    

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      相关资源
      最近更新 更多