📜  Requests-处理超时(1)

📅  最后修改于: 2023-12-03 14:47:04.225000             🧑  作者: Mango

Requests-处理超时

Requests是一个Python库,用于向服务器发起 HTTP 请求。它被设计成易于使用的,并且支持各种功能,例如按照优先级发出请求,HTTP/2支持,SSL验证和DNS解析等。但是,当服务器响应缓慢或出现宕机时,请求可能会超时或被取消。在这种情况下,Requests提供了多种方法来处理超时的情况。

连接超时

当发送一个请求时,Requests会等待服务器的响应。通常,连接到服务器需要几秒钟,但是如果服务器宕机或网络连接不佳,响应时间可能会延迟数倍。连接超时时间是Requests等待连接建立的时间。如果连接没有在设定的时间内建立,则抛出ConnectionError异常。可以通过timeout参数来设置连接超时时间。

import requests

try:
    response = requests.get('http://example.com/', timeout=5)
    print(response.text)
except requests.exceptions.Timeout:
    print('Connection timeout!')

在上面的代码段中,请求超时时间被设置为5秒。如果连接没有在5秒内建立,则会抛出Timeout异常,代码将跳转到except语句块。在except语句块中,我们打印了一个“Connection timeout!”的消息。

这种情况下,可以通过增加超时时间来尝试连接服务器。但是,如果连接本身是不可用的,则超时时间越长,响应时间越长。

读取超时

另一种处理超时的情况是读取超时。当连接建立后,在请求数据时可能会出现延迟或错误。例如,可能需要一段时间才能从数据库中检索数据并将其呈现给用户。在这种情况下,如果等待响应时间太长,则需要采取适当的措施来处理读取超时。

像连接超时一样,可以使用timeout参数来设置读取超时。以下代码段演示了如何设置读取超时的请求:

import requests

try:
    response = requests.get('http://example.com/', timeout=(5, 10))
    print(response.text)
except requests.exceptions.Timeout:
    print('Read timeout!')

在这里,timeout参数是一个元组,分别表示连接超时和读取超时。在上面的代码段中,连接超时被设置为5秒而读取超时被设置为10秒。如果读取操作需要超过10秒,则会抛出Timeout异常。

请注意,当设置读取超时时,不能保证响应数据的完整性。如果读取超时,则可能会发生响应数据丢失或缺失的情况。因此,您应该谨慎使用超时设置,并据此调整您的代码。

重试超时

在一些情况下,可能需要重复尝试访问服务器,以避免由于网络拥塞或其他原因导致的丢失响应。对超时的请求进行重试可能会有所帮助。

Requests库提供了一个Retry类,可以使用它来定义重试策略。这个策略可以定义最大重试次数,重试之间的延迟时间等等。以下代码段演示了如何使用Retry类和requests库实现重试:

import requests
from  requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

session = requests.Session()
retry = Retry(total=5, backoff_factor=0.1, status_forcelist=[ 500, 502, 503, 504 ])

adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.get('http://example.com/')
    print(response.text)
except requests.exceptions.Timeout:
    print('Connection timeout!')

在上面的代码段中,设置了一个最大重试次数为5次,一个指数退避因子为0.1秒,并定义了需要安装重试的HTTP状态代码。Retry类将用于HTTPAdapter中,并将为每个请求自动添加HTTPAdapter。

总结

在处理HTTP请求时,可能会出现超时的情况。Requests库提供了处理连接超时、读取超时和重试超时的方法。连接超时时间和读取超时时间可以用timeout参数设置。Retry类和HTTPAdapter可以用于自动重试超时请求。在使用这些选项时,请确保您的代码适合网站避免过度访问而被禁止访问。

以上为markdown格式的介绍。