+-
Python请求,如何限制接收大小,传输速率和/或总时间?
我的服务器执行外部请求,我想限制失败请求可以造成的损害.我想在这些情况下取消请求:

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

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

如何使用请求实现这些要求?

最佳答案
您可以尝试设置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

根据需要调整超时.

对于请求发布< 2.3.0(包括this change)你无法超时r.iter_content()产量;在块中间停止响应的服务器仍会占用连接.您必须在另外的timeout function中包含上述代码,以尽早切断长时间运行的响应.

点击查看更多相关文章

转载注明原文:Python请求,如何限制接收大小,传输速率和/或总时间? - 乐贴网