Python请求
1.基础模板
def managed_request(url):\"\"\" 基础的请求管理\"\"\" try: response = requests.get(url) return response.status_code except Exception as e: return str(e)
2.进阶版请求管理
def managed_request(method, url, **kwargs):#注意#*args:收集所有未命名的位置参数(positional arguments),形成一个元组(tuple)#**kwargs:收集所有未定义的关键字参数(keyword arguments),形成一个字典(dict) \"\"\"带重试和错误处理的请求管理(同步版本)\"\"\" retries = 0 #重试计数器 params = kwargs.get(\'params\', {})#获取查询参数 headers = kwargs.get(\'headers\', {})#获取请求头 headers[\"access-token\"] = ACCESS_TOKEN#添加令牌 while retries = 400: # 截断长响应 text = response.text[:200] + \"...\" if len(response.text) > 200 else response.text log(f\"请求失败 ({url}): HTTP {response.status_code}\") log(f\"错误响应: {text}\") retries += 1 # 增加重试计数 time.sleep(1) # 等待1秒 continue # 重试 # 成功响应处理 try: return response.json() # 返回JSON数据 except json.JSONDecodeError as e: # JSON解析失败 text = response.text[:500] + \"...\" if len(response.text) > 500 else response.text log(f\"JSON解析失败: {str(e)}\") log(f\"响应文本: {text}\") return None # 网络异常处理 except (requests.exceptions.RequestException, requests.exceptions.Timeout) as e: log(f\"请求错误 ({url}): {str(e)}\") retries += 1 time.sleep(1) # 未知异常处理 except Exception as e: log(f\"未知请求异常 ({url}): {str(e)}\") retries += 1 time.sleep(1) # 重试失败处理 log(f\"请求 {url} 重试{MAX_RETRIES}次后仍失败\") return None
主要改进点分析
-
请求方法支持
make_request
仅支持 GET 请求managed_request
支持所有 HTTP 方法(GET、POST、PUT 等),通过 method 参数指定
-
错误处理与重试机制
managed_request
实现了完整的重试逻辑,最多重试 MAX_RETRIES 次- 针对不同错误类型进行了分类处理:
- HTTP 406 错误时尝试刷新访问令牌
- 400 系列错误记录详细错误信息并重试
- 网络异常(超时、连接错误)捕获并重试
- 未知异常也会被捕获并重试
-
认证与令牌管理
- 自动添加 access-token 到请求头
- 当令牌过期(406 错误)时,自动调用 refresh_access_token 函数刷新令牌
- 刷新成功后自动使用新令牌重试请求
-
超时控制
managed_request
设置了明确的超时时间 REQUEST_TIMEOUT- 防止请求长时间挂起阻塞程序执行
-
详细日志记录
- 记录不同类型的错误信息,包括状态码、响应内容片段等
- 便于调试和监控系统运行状态
-
JSON 响应处理
- 自动解析 JSON 响应并返回 Python 对象
- 处理 JSON 解析错误并记录详细信息
-
参数传递
- 支持通过 kwargs 传递任意 requests 库支持的参数
- 例如 params 用于 URL 参数,headers 用于自定义请求头等
params = kwargs.get(\'params\', {})headers = kwargs.get(\'headers\', {})headers[\"access-token\"] = ACCESS_TOKEN之间的区别
1. params = kwargs.get(\'params\', {})
-
作用:从
kwargs
(关键字参数字典)中获取params
参数,若不存在则默认为空字典。 -
与其他参数的关系:
params
用于构建 URL 的查询字符串(如?key1=value1&key2=value2
),与请求头headers
属于不同的请求参数类型,互不影响。
2. headers = kwargs.get(\'headers\', {})
-
作用:从
kwargs
中获取headers
参数,若不存在则默认为空字典。 -
与其他参数的关系:
headers
保存 HTTP 请求头字段(如Content-Type
、User-Agent
),后续会被access-token
字段追加,形成完整的请求头。
3. headers[\"access-token\"] = ACCESS_TOKEN
-
作用:在
headers
中强制添加access-token
认证字段,值为全局变量ACCESS_TOKEN
。 -
与其他参数的关系:
-
若用户通过
kwargs
传入了headers
,则access-token
会覆盖用户可能存在的同名字段。 -
该字段与
params
无直接关联,但二者共同构成请求的完整参数(params
是 URL 参数,headers
是请求头)。
-