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

时间:2014-07-27 12:04:15

标签: http-headers python-requests http-get url-redirection content-length

所以当我试图了解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

1 个答案:

答案 0 :(得分:0)

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

  

默认情况下,Requests将为除HEAD之外的所有动词执行位置重定向。

您可以通过设置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);您的HEAD请求没有。

HEAD的服务器SHOULD return the same headers和GET一样,但RFC动词应该这也意味着如果实施成本过高或服务器成本过高,服务器可能会忽略该要求任何其他原因。

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

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