我的服务器执行外部请求,我想限制失败请求可以造成的损害。我想在这些情况下取消请求:
注意我没有在请求中查找timeout
参数,因为这只是暂停时的超时。我无法找到与总超时或限制总大小的方法有关的任何事情。一个示例显示maxsize
上的HTTPAdapter
参数,但未记录。
如何使用requests
来实现这些要求?
答案 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