0

requests 모듈을 이해하려고 할 때 깜짝 놀랐습니다.get을 사용하여 요청을 사용하여 content-length를 얻으면 정확한 결과를 얻을 수 있지만 머리를 쓰지 않는 이유는 무엇입니까?

>>> furl = 'http://www.downvids.net/downloads/07275feaf477cc0f5a7a67cba965594d5c83/' 

>>> resp = requests.get(furl, headers={'Accept-Encoding': 'identity'}) 
>>> resp.headers['content-length'] 
'7254371' 
>>> resp2 = requests.head(furl) 
>>> resp2.headers['content-length'] 
'20' 

하지만 requests.get에 의해 일을 내가 그것을 어떤에서 콘텐츠 길이를 점점 버퍼에 전체 파일을 다운로드하는 생각!

그래서 나는 HEAD 요청을 수행 할 때 나에게

+0

을 내가 http://stackoverflow.com/questions/23345225/http-head [이] (생각 -method-content-length-does-match-with-view-page-info? rq = 1)도 비슷한 대답을 찾고 있습니다. 그러나'requests' 모듈을 사용했습니다 ... 그는 일반적으로! –

답변

0

302했다 resp2.status_code, requests 세트 allow_redirects을 시도하기 때문에 것 같다 URL의 경우 리디렉션 경우 정확한 내용 길이를 얻을 수있는 올바른 방법이 될해야하는지 기본적으로 False로 설정됩니다. 이것은 리디렉션이 이고 기본값이 인 다른 모든 HTTP 메소드와 다릅니다. Redirection and History 설명서를 참조하십시오.

기본적으로 요청은 HEAD를 제외한 모든 verb에 대해 위치 재 지정을 수행합니다.

당신은 allow_redirects=True을 설정하여 리디렉션을 따르도록 강제 할 수

resp2 = requests.head(furl, allow_redirects=True) 

귀하의 GET은 (https://scontent-b-ams.xx.fbcdn.net/hvideo-xpa1/v/t42.1790-2/1598692_10153946120225652_1024334852_n.mp4?oh=de27dad30979955f4e8fef28b85f9af9&oe=53D50345 원래 URL에서) 리디렉션을 따르 않았다 HEAD 요청을하지 못했습니다. 그들이 GET을 위해 할 같이 HEAD하지만 SHOULD 여기 RFC 동사에 대한

서버 SHOULD return the same headers도 구현이 너무 비용이 많이 들거나 다른 이유로 될 경우 서버가 해당 요구 사항을 무시할 수 있다는 것을 의미한다.

당신은 항상 stream=True를 설정하여 몸을 다운로드하지 않습니다 GET 요청을 만들 수 있습니다 :

resp = requests.get(furl, stream=True) 
+0

그래서'requests.get'을 사용할 필요가 없지만'allow_redirects'가'True'로 설정되어 있어도'requests.head'가'content-length'를 얻지 못하는 상황이있을 수 있습니까? –

+0

서버 *는 GET이 반환하는 것과 동일한 헤더를 제공해야합니다. 실제로 일부 서버는 여전히 규칙을 위반할 수 있습니다. 'stream = True'를 설정 한 상태에서'request.get()'을 사용하는 것 이외에는 아무것도 변경할 수 없습니다. 응답 본문을 읽지 않습니다. –