[使用get使用请求获得内容长度会给出正确的结果,但为什么不使用头部?

问题描述 投票:0回答:1

所以,当我试图了解requests模块时,我感到有些惊讶。

>>> 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,它正在将整个文件下载到缓冲区,从中获取内容长度!!

所以,如果是URL重定向的话,正确的内容长度应该是正确的方法,这似乎是因为我尝试了resp2.status_code而使我302

http-headers python-requests http-get url-redirection content-length
1个回答
0
投票

[执行HEAD请求时,默认情况下,requestsallow_redirects设置为False;这与所有其他HTTP方法不同,默认情况下,其他所有HTTP方法的重定向遵循是[on]。请参阅Redirection and History文档:

默认情况下,请求将对除HEAD以外的所有动词执行位置重定向。

您可以通过设置allow_redirects=True来强制其遵循重定向:

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

您的GET确实遵循了重定向(从原始URL到https://scontent-b-ams.xx.fbcdn.net/hvideo-xpa1/v/t42.1790-2/1598692_10153946120225652_1024334852_n.mp4?oh=de27dad30979955f4e8fef28b85f9af9&oe=53D50345);您的HEAD请求没有。

HEAD的服务器SHOULD return the same headers就像GET一样,但是RFC动词

SHOULD

这里也意味着如果实现成本太高或出于任何其他原因,服务器可能会忽略该要求。您始终可以通过设置stream=True来发出不下载正文的GET请求:

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

© www.soinside.com 2019 - 2024. All rights reserved.