Http headers 使用get请求获取内容长度会得到正确的结果,但为什么不使用head呢?

Http headers 使用get请求获取内容长度会得到正确的结果,但为什么不使用head呢?,http-headers,python-requests,http-get,url-redirection,content-length,Http Headers,Python Requests,Http Get,Url Redirection,Content Length,所以,当我试图理解请求模块时,我有点惊讶 >>> furl = 'http://www.downvids.net/downloads/07275feaf477cc0f5a7a67cba965594d5c83/' >>> resp = requests.get(furl, headers={'Accept-Encoding': 'identity'}) >>> resp.headers['content-length'] '7254371'

所以,当我试图理解
请求
模块时,我有点惊讶

>>> 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'
但是通过
请求。get
我认为它正在下载整个文件到缓冲区,从中获取内容长度


那么,如果是url重定向的情况,应该采取什么正确的方法来获得正确的内容长度呢?这似乎是因为我尝试了
resp2。status\u code
给了我
302
当执行
HEAD
请求时,
请求默认情况下将
允许重定向设置为False;这与默认情况下启用重定向跟随的所有其他HTTP方法不同。请参阅文档:

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

通过设置
allow\u redirects=True
,可以强制它遵循重定向:

resp2 = requests.head(furl, allow_redirects=True)
 resp = requests.get(furl, stream=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来说就像它们对于GET一样,但是RFC动词在这里也意味着,如果实现成本太高或出于任何其他原因,服务器可能会忽略该需求

通过设置
stream=True
,始终可以发出不下载正文的GET请求:

resp2 = requests.head(furl, allow_redirects=True)
 resp = requests.get(furl, stream=True)

我想我也在寻求类似的答案,不过我使用了
请求
模块。。。他在问一般的问题!因此,无需使用
请求。get
大于,但是当
请求时可能会出现任何情况。head
不会获取
内容长度
,即使
allow\u redirects
设置为
True
,服务器应为您提供与get返回的标题相同的标题;实际上,一些服务器仍然可能违反该规则。除了使用
request.get()
stream=True
设置,然后不读取响应主体之外,您无法对此进行任何更改。