requests 库中的 hooks 参数

news/2025/11/24 11:55:36/文章来源:https://www.cnblogs.com/luoyc/p/19263411
requests 库中的 hooks 参数。

1. hooks 参数的作用

hooks 参数允许你在 HTTP 请求的特定生命周期事件前后执行自定义函数(称为 “钩子函数”)。这提供了一种强大的方式来拦截、修改或监控请求过程,而无需修改 requests 库本身的代码。
 
你可以把钩子想象成一个 “回调函数”,当请求达到某个特定阶段时,requests 会自动调用它。
 
常见的应用场景包括:
 
  • 请求前预处理:在请求发送之前修改请求头、请求参数或请求体。
  • 响应后处理:在获取到响应后,自动解析响应内容、处理错误、记录日志或提取特定数据。
  • 日志记录:记录所有发出的请求和收到的响应的详细信息,用于调试或审计。
  • 重试逻辑:当请求失败时(例如,遇到特定的状态码或网络错误),自动触发重试。
  • 性能监控:测量请求的耗时。

2. 如何使用 hooks 参数

hooks 参数接受一个字典,其中键是事件名称,值是一个或多个钩子函数。

2.1 常用的钩子事件

requests 主要支持以下几个钩子事件:
 
  • 'request': 在请求被发送之前调用。钩子函数接收 request 对象作为参数。
  • 'response': 在请求成功收到响应之后,并且在 requests 将响应返回给你之前调用。钩子函数接收 response 对象作为参数。
  • 'error': 在请求过程中发生异常时调用(例如,连接超时、DNS 错误等)。钩子函数接收 exception 对象作为参数。

2.2 钩子函数的签名

  • 对于 'request' 钩子:def hook_func(request, **kwargs):
  • 对于 'response' 钩子:def hook_func(response, **kwargs):
  • 对于 'error' 钩子:def hook_func(exc, **kwargs):
 
重要提示:
 
  • 钩子函数应该返回与输入相同类型的对象,或者 None。例如,response 钩子应该返回一个 Response 对象,否则后续的处理(包括你自己的代码)可能会出错。如果你只想 “观察” 而不 “修改”,只需返回接收到的对象即可。
  • **kwargs 参数是必须的,因为 requests 可能会在未来版本中传递更多参数。

2.3 使用示例

让我们通过几个例子来具体看看如何使用。
示例 1:简单的日志记录(response 钩子)
这是最常见的用法之一,用于打印出请求和响应的详细信息。
 
import requestsdef print_response_details(response, **kwargs):"""打印响应的详细信息"""print(f"请求 URL: {response.url}")print(f"状态码: {response.status_code}")print(f"响应头: {response.headers}")print(f"响应内容: {response.text[:100]}...")  # 只打印前100个字符print("-" * 50)return response  # 必须返回 response 对象

url = 'https://api.github.com/users/octocat'# 在 get 请求中添加 hooks
response = requests.get(url, hooks={'response': print_response_details})# 你的后续代码...
# print(response.json())

 

示例 2:请求前修改 headers(request 钩子)
假设你想为所有请求自动添加一个 User-Agent 头。
import requestsdef add_custom_header(request, **kwargs):"""在请求发送前添加自定义的 User-Agent"""request.headers['User-Agent'] = 'MyCustomUserAgent/1.0'print(f"修改后的请求头: {request.headers}")return request # 必须返回 request 对象

url = 'https://httpbin.org/headers' # 这个网站会返回你的请求头# 发送请求
response = requests.get(url, hooks={'request': add_custom_header})print(response.text)

 

 
运行后,你会在 response.text 中看到 User-Agent 已经被修改为我们自定义的值。
示例 3:处理错误并自动重试(response 钩子)
这个例子展示了如何在遇到 500 Internal Server Error 时自动重试请求。
 
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry# 方法一:使用 urllib3 的 Retry 机制(更推荐)
# 这是处理重试的标准方法,功能更强大
def create_retry_session():session = requests.Session()retry_strategy = Retry(total=3,  # 总重试次数backoff_factor=1, # 重试间隔时间(1, 2, 4, ...秒)status_forcelist=[429, 500, 502, 503, 504], # 对这些状态码重试allowed_methods={"GET", "POST"} # 对这些方法重试
    )adapter = HTTPAdapter(max_retries=retry_strategy)session.mount("https://", adapter)session.mount("http://", adapter)return session# 使用带有重试机制的 Session
# session = create_retry_session()
# response = session.get("https://httpbin.org/status/500")
# print(response.status_code)# 方法二:使用 hooks 实现一个简单的重试(仅作演示)
# 注意:这种方法不如 Retry 机制健壮,例如它不处理 backoff 等
def simple_retry_hook(response, **kwargs):if response.status_code == 500:print(f"服务器内部错误 (500),正在重试...")# 可以在这里再次调用 requests.get/post,但要注意避免无限循环# 这是一个简化的例子,实际应用中需要更完善的逻辑# 通常,我们会结合 session 和 hooks 来实现return requests.get(response.url, hooks={'response': simple_retry_hook})return response# 演示如何使用
try:# 使用一个会随机返回 500 的测试地址response = requests.get("https://httpbin.org/status/500", hooks={'response': simple_retry_hook})print(f"最终状态码: {response.status_code}")
except requests.exceptions.RetryError as e:print(f"重试多次后仍然失败: {e}")

 

 
注意:对于重试逻辑,官方更推荐使用 urllib3 的 Retry 机制配合 requests.Session,如上面代码注释中所示。hooks 提供了另一种灵活的实现方式,但通常更适合简单的场景。

3. 在 Session 中使用 hooks

如果你在一个会话(Session)中发送多个请求,并且希望所有请求都应用相同的钩子,你可以在创建 Session 时设置 hooks
 
import requestsdef log_request(request, **kwargs):print(f"发送请求到: {request.url}")return requestdef log_response(response, **kwargs):print(f"收到响应,状态码: {response.status_code}")return response# 创建一个带有钩子的 Session
s = requests.Session()
s.hooks.update({'request': log_request,'response': log_response
})# 使用这个 Session 发送的所有请求都会触发钩子
s.get('https://api.github.com/users/octocat')
print("---")
s.get('https://api.github.com/repos/psf/requests')

总结

hooks 是 requests 库中一个非常灵活和强大的功能。它允许你在不侵入主逻辑的情况下,对请求的整个生命周期进行精细的控制和扩展。
  • 核心思想:在请求的特定阶段插入自定义函数。
  • 常用事件:'request' (前), 'response' (后), 'error' (错误时)。
  • 使用方式:作为参数传递给 requests.get/post 等方法,或在 Session 对象上设置。
  • 注意事项:钩子函数通常需要返回它们接收的对象(request 或 response),以便请求链能够继续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Playwright MCP浏览器自动化全攻略:让AI听懂你的指令

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 试想一下,您只需对AI说:“请帮我找到最近三个月内关于AI代理的最新研究论文,下载PDF并整理成一个摘要表格”,它就能自动打开浏览器,导…

2025年评价高的自动化篷布设备用户好评厂家排行

2025年评价高的自动化篷布设备用户好评厂家排行 行业背景与市场趋势 随着全球物流、建筑、农业及户外休闲产业的快速发展,自动化篷布设备市场需求持续增长。据《2024-2029年全球篷布设备行业分析报告》显示,2023年…

拓扑 AC 2025 线上 NOIP 联测 #5

0 + 100 + 10 + 45 = 155, Rank 9/50.A 忘判无解怒挂 100pts![2025线上NOIP联测第三阶段] 模拟赛 5 链接:link 题解:暂无 时间:4h (2025.11.24 07:40~) 题目数:4 难度:A B C D\(\color{#52C41A} 绿\) \(\color{#…

布局基础(二):层叠布局Stack的层叠、对齐与绝对定位实战 - 青青子衿-

引言:为什么需要层叠布局? 在构建现代应用界面时,我们经常需要实现元素重叠的效果,比如悬浮按钮、图片水印、弹窗遮罩等。与线性布局的顺序排列不同,层叠布局(Stack)允许子组件在Z轴方向上叠加显示,为界面设计…

聊城市一对一家教辅导推荐,2026年最新课外家教补习机构口碑测评排名榜

在素有"江北水城"美誉的聊城,从东昌府区的政务中心到临清市的运河古城,从茌平、东阿的产业集聚区到莘县、冠县、阳谷、高唐的特色农业县,优质教育资源的寻求始终是每个家庭的核心关切。无论是在万达广场的…

布局基础(一):线性布局Column与Row的排列、对齐与间距控制 - 青青子衿-

引言:构建UI界面的基石 线性布局是HarmonyOS应用开发中最基础、使用最频繁的布局方式。作为ArkUI布局体系的基石,Column和Row组件几乎出现在每一个HarmonyOS应用的界面中。理解线性布局的核心原理和灵活运用技巧,是…

2025年叠片铁芯订做厂家权威推荐榜单:折角铁芯/ED铁芯/SD铁芯源头厂家精选

在变压器、互感器等电力设备的核心部件中,叠片铁芯的品质直接决定着整机的能效与稳定性。面对市场上众多的订做厂家,选择一家技术过硬、服务专业的供应商成为保障产品质量的关键。 随着全球电力设备及新能源产业的快…

基于FFT变换的雷达信号检测和参数估计matlab性能仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 雷达系统由两个间距为 d 的接收天线组成,同时假设阵元孔径远远小于信号源与阵列…

DevEco Studio 4.0深度探索:为高效HarmonyOS开发赋能的全方位工具链 - 青青子衿-

引言:IDE如何成为开发效率的倍增器 在HarmonyOS应用开发中,选择合适的集成开发环境(IDE)至关重要。作为鸿蒙生态的官方IDE,DevEco Studio 4.0不仅仅是一个代码编辑器,更是集编码、调试、测试、预览于一体的全链路…

2025年口碑好的同步阻尼隐藏轨行业内知名厂家排行榜

2025年口碑好的同步阻尼隐藏轨行业内知名厂家排行榜行业背景与市场趋势随着现代家具制造业的快速发展,同步阻尼隐藏轨作为高端五金配件的重要组成部分,市场需求持续增长。根据中国五金制品协会最新发布的《2024-2025…

2025年板材拉力试验机源头厂家权威推荐:拉伸强度试验机/拉伸试验机/波纹管压力试验机源头厂家精选

在材料检测与质量控制领域,一台精密的板材拉力试验机正成为决定材料性能评价准确性和产品可靠性的关键因素。 随着我国制造业品质升级步伐加快,材料检测设备市场正迎来稳定增长。板材拉力试验机作为材料力学性能测试…

2025年质量好的高定极简针式铰链品牌厂家排行榜

2025年质量好的高定极简针式铰链品牌厂家排行榜行业背景与市场趋势随着现代家居设计向极简主义风格持续演进,高端定制五金配件市场迎来了快速增长期。根据中国五金制品协会最新发布的《2024-2025中国建筑五金行业白皮…

2025长沙公务员面试培训机构评分排行榜,湖南靠谱的长沙公务员面试辅导班推荐综合实力与口碑权威评选

前言 随着2025年长沙公务员招录工作的推进,面试培训市场呈现出蓬勃发展的态势。本文基于市场调研数据、师资实力、服务体系及学员反馈等多个维度,对长沙地区公务员面试培训机构进行客观评估,旨在为考生提供专业参考…

2025 年 11 月唐卡精品权威推荐榜:手绘珍品、彩绘精品、定制佳作,传统工艺与艺术收藏价值深度解析

2025 年 11 月唐卡精品权威推荐榜:手绘珍品、彩绘精品、定制佳作,传统工艺与艺术收藏价值深度解析 一、唐卡艺术行业的发展现状与收藏价值 唐卡作为藏族文化中独具特色的宗教绘画艺术形式,其历史可追溯至吐蕃时期。…

2025年知名的隐藏式抽屉滑轨实力厂家TOP推荐榜

2025年知名的隐藏式抽屉滑轨实力厂家TOP推荐榜行业背景与市场趋势随着家居行业向智能化、高端化方向发展,隐藏式抽屉滑轨作为五金配件中的关键部件,其市场需求持续增长。据《2024-2025中国家居五金行业白皮书》显示,…

JSAPIThree 地图投影学习笔记:理解坐标系统

这是一篇关于 JSAPIThree(mapvthree)地图投影的学习笔记,以初学者的视角记录什么是地图投影、如何选择投影方式、如何设置投影等功能的完整学习过程。作为一个刚开始学习 mapvthree 的小白,今天要学习地图投影了!…

2025年评价高的南京工程发电机厂家推荐及选购参考榜

2025年评价高的南京工程发电机厂家推荐及选购参考榜行业背景与市场趋势随着中国基础设施建设的持续投入和工业生产的稳步发展,工程发电机作为重要的备用电源设备,市场需求保持稳定增长。据中国电力设备行业协会2024年…

2025 最新电驱动厂家权威推荐榜:甄选技术领先、口碑卓越的实力厂家,涵盖电机测试与动力传动测试优质服务商通用电机测试/电机对拖试验平台/动力传动测试公司推荐

引言 随着智能制造、航空航天等行业的快速迭代,电驱动领域市场需求持续攀升,但行业乱象仍存:部分品牌核心技术缺失,测试系统精度不足、数据重复性差,难以匹配高端领域的严苛标准;产品质量参差不齐、售后响应滞后…

【程序人生】新时代应该怎样的数字化人才?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年口碑好的除螨衣物烘干机厂家最新推荐排行榜

2025年口碑好的除螨衣物烘干机厂家最新推荐排行榜行业背景与市场趋势随着消费者健康意识的不断提升和智能家居市场的快速发展,除螨衣物烘干机作为现代家庭健康护理的重要设备,近年来呈现出强劲的增长态势。据中国家用…