【发布时间】:2013-01-11 02:27:19
【问题描述】:
我查看了请求文档,但似乎找不到任何东西。如何只请求标头,以便评估文件大小?
【问题讨论】:
我查看了请求文档,但似乎找不到任何东西。如何只请求标头,以便评估文件大小?
【问题讨论】:
发送HEAD request:
>>> import requests
>>> response = requests.head('http://example.com')
>>> response.headers
{'connection': 'close',
'content-encoding': 'gzip',
'content-length': '606',
'content-type': 'text/html; charset=UTF-8',
'date': 'Fri, 11 Jan 2013 02:32:34 GMT',
'last-modified': 'Fri, 04 Jan 2013 01:17:22 GMT',
'server': 'Apache/2.2.3 (CentOS)',
'vary': 'Accept-Encoding'}
HEAD 请求类似于仅下载标头的 GET 请求。请注意,实际上是否满足您的 HEAD 请求取决于服务器。有些服务器只会响应 GET 请求,因此您必须发送 GET 请求并关闭连接而不是下载正文。其他时候,服务器从不指定文件的总大小。
【讨论】:
content-length--有时响应是使用Transfer-Encoding: chunked 生成的,在这种情况下,除非您实际得到响应,否则无法知道响应会持续多长时间整个响应。
urllib.urlopen(url).info()['content-length'] 检索到的大小不同,所以不是我想要的。
使用requests.get(url, stream=True).headers['Content-length']
stream=True 表示函数返回时,只下载响应头,不下载响应体。
requests.get 和 request.head 都可以获得标题,但使用 get 有一个优势
get 更灵活,如果你想在检查长度后下载响应正文,你可以简单地访问 content 属性或使用 iterator 开始,它将以块的形式下载内容这里是一个获取MIT open course video长度的例子
MitOpenCourseUrl = "http://www.archive.org/download/MIT6.006F11/MIT6_006F11_lec01_300k.mp4"
resHead = requests.head(MitOpenCourseUrl)
resGet = requests.get(MitOpenCourseUrl,stream=True)
resHead.headers['Content-length'] # output 169
resGet.headers['Content-length'] # output 121291539
【讨论】:
stream 设置为 True,除非您消耗所有数据或调用,否则 Requests 无法将连接释放回池中Response.close。这可能会导致连接效率低下。如果您在使用 stream=True 时发现自己部分读取请求正文(或根本不读取它们),您应该在 with 语句中发出请求以确保它始终关闭"
获取文件大小 -->
file.headers.get('Content-Length')
【讨论】:
request.FILES 不同,它看起来像是框架 (Django?) 的一部分,并且是服务器端来处理接收到的请求。