在不下载正文的情况下检查Python中的HTTP POST标头

时间:2011-06-01 19:39:39

标签: python http urllib2

Web服务器使用要下载的文件响应POST请求(具有Content-Disposition标头)。使用urllib或机械化开启器将在什么时候下载响应主体?

opener = mechanize.build_opener(HTTPRefererProcessor, HTTPEquivProcessor, HTTPRefreshProcessor)
r = make_post_request() # makes Request object to send
res = opener.open(r)
info = response.info()
content_disp = info.getheader('content-disposition')
filename = content_disp.split('=')[1]
content = res.read() # or skip based on filename

我的印象是,在读取()之前,主体不会下载,这对于跳过某些下载(例如已下载的文件)非常有用,但我没有看到很大的性能提升。

2 个答案:

答案 0 :(得分:3)

HTTP是一种无连接协议,这意味着没有建立通道,服务器可以通过几个步骤写入数据。因此,如果POST或GET请求被发送到服务器,它必须以完整的响应进行响应,因为它无法知道,如果它是第一个或第二个请求。 Cookies,AJAX,Comet有助于模仿像频道这样的东西,但没有一个。这就是HEAD请求的原因:浏览器可以确定是否必须加载资源。

答案 1 :(得分:1)

好吧,当你只想要标题时,你应该使用HTTP HEAD。根据定义,POST和GET将返回内容。

在停止下载方面,Web服务器不会等待开始向您发送数据,从Python到网卡的所有内容都将立即开始接收和缓冲数据。

所以你最好的办法是找到一种更好的方法 - 例如HTTP HEAD。如果这不是一个选项,请在获取所需的任何标题后立即在请求对象上调用close(),并希望您不要浪费太多带宽。

(关于在Python中使用HTTP HEAD的示例,see this answer from a while ago。)