2014-02-18 2 views
0

Constraint: Я не имею возможность использовать Python 3, поэтому requests вне вопросаurllib2 ответ только: почему почтовый запрос не дает ответа 302?

мне нужно автоматизировать загрузки файла задачу.

В 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, как ожидалось?

ответ

0

Это простой вопрос.

В своем коде, как это:

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

Когда вы получите результат форму urllib2.HTTPRedirectHandler.http_error_301, result.code и result.status 200, местный вар code именно 301.
Затем вы устанавливаете status в code, который 301 .
Но, result.code все еще является 200.

Это все, спасибо.

+0

На самом деле методы «SmartRedirectHandler» вообще не вызываются. В результате нет поля состояния –