urllib2仅回答:为什么post请求不会产生302响应?

时间:2014-02-18 06:34:23

标签: python urllib2 python-2.4

约束:我没有使用python 3的选项,因此requests是不可能的

我需要自动执行文件下载任务。

在Firefox中我可以看到此网址www.example.com/files/MyFile_2014-02-14.csv上的文件请求在开发者控制台中是这样的:

14:38:33.782 POST www.example.com [HTTP/1.1 302 Found 406ms]
14:38:34.288 GET www.example.com/files/MyFile_2014-02-14.csv/ [HTTP/1.1 200 OK 687ms]

我使用以下代码自动执行该过程

import urllib
import urllib2
import cookielib

class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
    ''' use it to prove if I get a 302 or not'''
    def http_error_301(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
        result.status = code
        return result

    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
        result.status = code
        return result

def main():


    proxy_handler = urllib2.ProxyHandler({'http': 'http://myproxy.local'})

    username='XXX'
    password='YYY'

    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, 'http://www.example.com', username, password)
    pass_handler = urllib2.HTTPBasicAuthHandler(passman)


    cookieJar = cookielib.CookieJar()
    cookieprocessor = urllib2.HTTPCookieProcessor(cookieJar)

    srh = SmartRedirectHandler()

    opener =urllib2.build_opener(proxy_handler, pass_handler, cookieprocessor, srh)
    urllib2.install_opener(opener)

    data = urllib.urlencode({'username':username, 'password':password}) # To force post
    fileurl = 'http://www.example.com/files/MyFile_2014-02-14.csv'
    req = urllib2.Request(fileurl, data, headers={'Proxy-Connection':'keep-alive'})

    c = urllib2.urlopen(req) 

c.code始终为200,而c.read()仅在我们的欢迎页面上提供内容(仅在成功登录后才可用)

为什么我没有按预期获得302?

1 个答案:

答案 0 :(得分:0)

这是一个简单的问题。

在你的代码中,像这样:

    result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
    result.status = code

当您获得结果表单urllib2.HTTPRedirectHandler.http_error_301result.coderesult.status为200时,本地变量code为301.
然后,您将status设置为code,即301 但是,result.code仍然是200。

这就是全部,谢谢。