Python请求,如何限制接收大小,传输速率和/或总时间?

时间:2014-03-12 08:45:23

标签: python python-requests

我的服务器执行外部请求,我想限制失败请求可以造成的损害。我想在这些情况下取消请求:

  • 请求的总时间超过一定限度(即使数据仍然到达)
  • 总接收大小超过某个限制(我需要在接受更多数据之前取消)
  • 转移速度降到某个水平以下(如果可以提供总时间限制,我可以没有这个转移)

注意我没有在请求中查找timeout参数,因为这只是暂停时的超时。我无法找到与总超时或限制总大小的方法有关的任何事情。一个示例显示maxsize上的HTTPAdapter参数,但未记录。

如何使用requests来实现这些要求?

2 个答案:

答案 0 :(得分:13)

您可以尝试设置stream=True,然后在以块的形式读取数据时超出时间或大小限制时中止请求。

requests release 2.3.0开始,超时也适用于流请求,因此您需要做的就是允许初始连接和每个迭代步骤超时:

r = requests.get(..., stream=True, timeout=initial_timeout)
r.raise_for_status()

if int(r.headers.get('Content-Length')) > your_maximum:
    raise ValueError('response too large')

size = 0
start = time.time()

for chunk in r.iter_content(1024):
    if time.time() - start > receive_timeout:
        raise ValueError('timeout reached')

    size += len(chunk)
    if size > your_maximum:
        raise ValueError('response too large')

    # do something with chunk

根据需要调整超时。

对于requests版本< 2.3.0(包括this change)你无法超时r.iter_content()收益率;在块中间停止响应的服务器仍会占用连接。您必须将上述代码包装在一个额外的timeout function中,以便尽早切断长时间运行的响应。

答案 1 :(得分:-2)

它对我有用

import requests

response = requests.get(your_url, stream=True, timeout=10)
response_content = [] #contains partial or full page_source 

for chunk in response.iter_content(1024):
    if len(chunk)>10000: # you can decide your chunk size limit(page_size)
       response_content.append(chunk)
       response.close()
       break
     else:
         response_content.append(chunk) # has full page source
         break