python requests timeout
引言
在编写网络应用程序时,通常需要与远程服务器进行通信。Python 提供了许多库来处理HTTP通信,其中最受欢迎的之一是requests
库。它提供了简单易用的接口,使得发送HTTP请求变得非常方便。然而,当与远程服务器通信时,经常会遇到网络延迟或服务器响应缓慢的情况。为了避免应用程序因此而变得缓慢或无响应,我们可以使用requests
库提供的超时设置来控制请求的最大等待时间。
本文将详细介绍在Python中使用requests
库设置超时,并提供一些示例代码以及运行结果。
requests
库简介
requests
是一个常用的用于发送HTTP请求的Python 第三方库。通过使用requests
库,可以轻松地发送HTTP GET、POST、PUT、DELETE等请求,并能接收和处理服务器返回的响应。
使用requests
发送请求
在使用requests
发送HTTP请求之前,首先必须先安装该库。可以通过pip安装,运行以下命令:
pip install requests
安装完成后,可以通过导入requests
模块来使用。
发送GET请求
import requests
response = requests.get('https://www.example.com')
print(response.text)
在上述代码中,我们使用了get
方法来发送一个GET 请求。该方法的参数为待访问的URL。并将服务器响应存储在名为response
的变量中。随后通过response.text
属性获取服务器返回的HTML内容并打印。
发送POST请求
import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://www.example.com', data=data)
print(response.status_code)
在上述代码中,我们使用了post
方法来发送一个POST请求。与GET请求不同,POST请求可以附带数据。在上述代码中,我们通过data
参数向请求中添加了一些键值对数据。同样的,服务器的响应被存储在response
变量中,并通过response.status_code
属性获取HTTP状态码并打印。
设置超时
在某些情况下,远程服务器可能响应非常缓慢或者网络延迟很高,如果我们不设置超时时间,那么应用程序可能会因等待服务器响应而停滞或无响应。为了避免这种情况,requests
库提供了超时参数,可以设置最大等待时间。
超时参数
requests
库提供了两种方法来设置超时时间:全局超时和单个请求超时。
全局超时
可以通过修改requests
库的timeout
属性来设置全局的超时时间。默认情况下,该属性值为None
,即不设置超时时间。可以将其设置为一个浮点数,表示等待服务器响应的最大时间,单位为秒。
import requests
# 设置全局超时时间为5秒
requests.timeout = 5.0
response = requests.get('https://www.example.com')
print(response.text)
在上述代码中,我们将requests
库的timeout
属性设置为5.0秒。这意味着在发送任何请求时,将最多等待5秒钟以获取服务器响应。如果在5秒内没有收到响应,将引发TimeoutError
异常。
单个请求超时
除了全局超时设置外,我们还可以为每个请求单独设置超时参数。可以在发送请求时,通过传递一个timeout
参数来设置当前请求的超时时间。
import requests
# 单独设置超时时间为3秒
response = requests.get('https://www.example.com', timeout=3.0)
print(response.text)
在上述代码中,我们通过传递timeout
参数为3.0秒来设置单个请求的超时时间。如果在3秒内没有收到响应,将引发TimeoutError
异常。
超时处理
当请求超时时,requests
库将引发TimeoutError
异常。我们可以使用try-except
块来捕获并处理该异常,以便在发生超时时进行适当的操作。
捕获超时异常
import requests
try:
response = requests.get('https://www.example.com', timeout=3.0)
print(response.text)
except requests.Timeout:
print("请求超时")
在上述示例中,当发生超时时,将引发requests.Timeout
异常,并在except
块中处理该异常。在发生超时时,将打印一条错误消息”请求超时”。
设置重试次数
为了应对可能的网络问题和服务器响应缓慢的情况,我们可以设置重试次数。在发生超时时,可以再次尝试发送请求,直到达到最大尝试次数。
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
retry_strategy = Retry(total=3, backoff_factor=1, status_forcelist=[ 500, 502, 503, 504 ])
adapter = HTTPAdapter(max_retries=retry_strategy)
requests.Session().mount('http://', adapter)
requests.Session().mount('https://', adapter)
try:
response = requests.get('https://www.example.com', timeout=3.0)
print(response.text)
except requests.Timeout:
print("请求超时")
在上述示例中,我们创建了一个自定义的重试策略和一个HTTP适配器,并将其应用于requests
库的会话对象。在发送请求时,将按照重试策略进行多次尝试。
示例和运行结果
下面是一个完整的示例代码,演示了如何使用requests
库设置超时时间,并处理可能的超时异常。
import requests
try:
# 设置超时时间为3秒
response = requests.get('https://www.example.com', timeout=3.0)
# 打印服务器返回的HTML内容
print(response.text)
except requests.Timeout:
print("请求超时")
运行以上示例代码时,如果服务器在3秒内未响应,将输出”请求超时”。如果成功接收到服务器响应,则会打印相应的HTML内容。
结论
在编写网络应用程序时,超时设置是一项非常重要的安全和性能功能。使用requests
库,我们可以轻松地设置请求的超时时间,并处理超时异常。通过适当地设置超时时间,我们可以避免应用程序因网络延迟或服务器响应缓慢而导致的无响应或缓慢响应的情况。