HTTPX重试机制自动了吗

wen python案例 1

本文目录导读:

HTTPX重试机制自动了吗

  1. 默认行为
  2. 如何启用重试
  3. 推荐的配置
  4. 注意事项

是的,HTTPX 默认情况下不会自动重试,但你可以通过配置来启用自动重试机制。

默认行为

HTTPX 在遇到请求失败(如网络错误、超时)时,默认不会自动重试,而是直接抛出异常。

如何启用重试

使用 Transport 配置(推荐)

import httpx
# 创建自定义传输层,配置重试策略
transport = httpx.HTTPTransport(retries=3)  # 最多重试3次
with httpx.Client(transport=transport) as client:
    response = client.get('https://example.com')

使用事件钩子(更灵活)

import httpx
from httpx import Client, Transport
class RetryTransport(httpx.BaseTransport):
    def __init__(self, max_retries=3):
        self.max_retries = max_retries
        self.transport = httpx.HTTPTransport()
    def handle_request(self, request):
        for attempt in range(self.max_retries + 1):
            try:
                return self.transport.handle_request(request)
            except (httpx.ConnectError, httpx.TimeoutException) as e:
                if attempt == self.max_retries:
                    raise
                # 可以添加退避策略
                import time
                time.sleep(2 ** attempt)  # 指数退避
with httpx.Client(transport=RetryTransport()) as client:
    response = client.get('https://example.com')

使用第三方库(更完善)

tenacity 库提供了更强大的重试机制:

import httpx
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def fetch_url(url):
    with httpx.Client() as client:
        response = client.get(url, timeout=5.0)
        response.raise_for_status()
        return response
result = fetch_url('https://example.com')

推荐的配置

import httpx
# 基本重试配置
transport = httpx.HTTPTransport(
    retries=3,  # 重试次数
)
# 结合超时和重试
with httpx.Client(
    transport=transport,
    timeout=httpx.Timeout(30.0, connect=5.0)  # 总超时30秒,连接超时5秒
) as client:
    try:
        response = client.get('https://example.com')
    except httpx.RequestError as e:
        print(f"请求最终失败: {e}")

注意事项

  • 幂等性:确保你的请求是幂等的(GET 可以安全重试,POST 要小心)
  • 退避策略:建议使用指数退避避免服务器压力
  • 错误类型:通常只对网络错误、超时重试,不对 4xx 错误重试
  • 并发安全:如果你使用异步客户端,需要确保重试逻辑是线程安全的

简单总结:HTTPX 默认不自动重试,但通过 HTTPTransport 的 retries 参数或自定义逻辑,可以轻松实现自动重试机制

抱歉,评论功能暂时关闭!