2014-02-18 4 views
0

제약 : 나는, 파이썬 3를 사용하는 옵션이없는 때문에 requests 질문 내가 파일 다운로드 작업을 자동화해야urllib2 답변 만 : 게시물 요청이 302 응답을 생성하지 않는 이유는 무엇입니까?

를 벗어났습니다. 나는이 URL을 www.example.com/files/MyFile_2014-02-14.csv에서 파일에 대한 요청을 볼 수 Firefox에서

는 개발자 콘솔에서 다음과 같이 간다 : 나는

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는 항상 과정을 자동화하기 위해 다음 코드를 사용

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] 

을 200 및 c.read()은 내 환영 페이지에서만 내용을 제공합니다 (로그인 성공 후 사용 가능)

왜 예상대로 302를 얻지 못합니까?

답변

0

간단한 질문입니다. 당신이 결과 양식 urllib2.HTTPRedirectHandler.http_error_301, result.coderesult.status는 200, 지역 VAR code 다음 301
됩니다 얻을 때, 당신은 codestatus을 설정

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

, 301 인 :이 같은 코드에서

,
하지만 여전히 result.code은 200입니다.

감사합니다.

+0

실제로 'SmartRedirectHandler'의 메소드는 전혀 호출되지 않습니다. 결과에 '상태'입력란이 없습니다. –