Django:如何返回原始响应

时间:2011-10-31 10:35:46

标签: django response urllib2

这就是我想要的。

  1. 向外部站点提交POST请求(即登录信息)。
  2. 收到回复
  3. 将原始回复返回给我客户的浏览器(包含用于登录的cookie) 验证)。
  4. 如果客户端尝试在新标签中访问该网站,则会发现他已登录。
  5. 我成功完成了步骤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& amp禁用了csrf。错误消失了

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

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