在 Python 的 requests
库中,hooks 是一个强大的功能,它允许用户在请求的生命周期中的特定时刻插入自定义函数。这些函数被称为钩子函数,它们可以在发送请求之前或收到响应之后执行。
架构
requests
的 hooks 架构允许用户在以下两个时刻插入自定义逻辑:
- 请求发送前 (
pre_request
): 在请求发送之前执行,可以用来修改请求头、请求体等。 - 响应接收后 (
post_response
): 在接收到响应后执行,可以用来处理响应内容、状态码等。
组建内容
- 钩子函数: 用户定义的函数,根据需要在请求前或响应后执行。
- Hook 装饰器:
requests
提供了两个装饰器requests.hooks.pre_request
和requests.hooks.post_response
,用于将钩子函数注册到请求中。
代码案例
下面是一个使用 requests
库中的 hooks 的示例代码:
import requests
# 定义一个钩子函数,用于在请求发送前打印出请求的详细信息
def print_url_hook(response, *args, **kwargs):
print(f"Request URL: {response.request.url}")
print(f"Request Headers: {response.request.headers}")
print(f"Request Body: {response.request.body}")
# 定义一个钩子函数,用于在收到响应后打印出响应的详细信息
def print_response_hook(response, *args, **kwargs):
print(f"Response URL: {response.url}")
print(f"Response Status Code: {response.status_code}")
print(f"Response Headers: {response.headers}")
print(f"Response Body: {response.text}")
# 创建一个 Session 对象
session = requests.Session()
# 注册钩子函数
session.hooks['response'].append(print_url_hook)
session.hooks['response'].append(print_response_hook)
# 发送一个 GET 请求
response = session.get("https://httpbin.org/get")
# 关闭 Session
session.close()
在这个示例中,我们定义了两个钩子函数:print_url_hook
和 print_response_hook
。前者在请求发送前打印出请求的 URL、头和体,后者在收到响应后打印出响应的 URL、状态码、头和体。然后,我们创建了一个 Session
对象,并将这两个钩子函数添加到 hooks
字典中。最后,我们使用这个 Session
对象发送一个 GET 请求。
注意:在上面的代码中,我们使用了 session.hooks['response']
来添加钩子函数。这是因为 requests
库的 hooks
字典只支持 'response'
这个键,而 'pre_request'
和 'post_response'
装饰器在 requests
库中并不存在。因此,所有的钩子函数都会在响应接收后执行。
这个示例展示了如何使用 requests
库的 hooks 功能来插入自定义逻辑,以便在请求发送前和响应接收后执行特定的操作。这可以用来进行日志记录、监控、认证等。