Requests 高级用法详解:从会话管理到自定义认证
requests A simple, yet elegant, HTTP library. 项目地址: https://gitcode.com/gh_mirrors/re/requests
Requests 是 Python 中最受欢迎的 HTTP 客户端库之一,它简化了 HTTP 请求的发送过程。本文将深入探讨 Requests 库的一些高级功能,帮助开发者更高效地使用这个强大的工具。
会话对象:提升请求效率的利器
会话(Session)对象是 Requests 中一个极其有用的功能,它允许你在多个请求之间保持某些参数和状态。使用会话对象可以带来以下优势:
- 持久化参数:可以在会话级别设置参数,这些参数会自动应用到该会话的所有请求中
- Cookie 保持:自动处理 Cookie,无需手动管理
- 连接池:重用底层 TCP 连接,显著提高性能
基础会话使用示例
import requests
# 创建会话实例
s = requests.Session()
# 第一个请求设置 Cookie
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
# 第二个请求会自动携带之前设置的 Cookie
r = s.get('https://httpbin.org/cookies')
print(r.text) # 输出: {"cookies": {"sessioncookie": "123456789"}}
会话级别的默认设置
你可以在会话对象上设置默认参数,这些参数会自动应用到所有请求中:
s = requests.Session()
s.auth = ('username', 'password') # 基本认证
s.headers.update({'X-Test': 'true'}) # 默认头部
# 这个请求会自动包含认证信息和默认头部
response = s.get('https://httpbin.org/headers')
方法参数与会话参数的优先级
当方法级别的参数与会话级别的参数冲突时,方法级别的参数会覆盖会话参数:
s = requests.Session()
s.headers.update({'X-Test': 'true'})
# 这个请求会发送两个头部:X-Test 和 X-Test2
response = s.get('https://httpbin.org/headers', headers={'X-Test2': 'true'})
上下文管理器用法
会话对象可以作为上下文管理器使用,确保资源正确释放:
with requests.Session() as s:
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
# 会话会在 with 块结束时自动关闭
请求与响应对象深入解析
每次调用 requests.get()
等方法时,实际上发生了两件事:
- 构造一个
Request
对象,包含所有请求信息 - 服务器返回响应后,生成一个
Response
对象
访问响应信息
r = requests.get('https://example.com')
# 访问响应头
print(r.headers)
# 访问请求头(原始请求)
print(r.request.headers)
预备请求:精细控制请求细节
预备请求(Prepared Request)允许你在发送请求前对请求进行精细调整:
from requests import Request, Session
s = Session()
req = Request('GET', 'https://httpbin.org/get')
prepped = s.prepare_request(req)
# 修改预备请求
prepped.headers['X-Custom'] = 'value'
response = s.send(prepped)
print(response.status_code)
SSL 证书验证
Requests 默认会验证 SSL 证书,确保 HTTPS 连接的安全性:
# 默认验证证书
requests.get('https://example.com')
# 禁用证书验证(不推荐生产环境使用)
requests.get('https://example.com', verify=False)
# 指定自定义 CA 证书路径
requests.get('https://example.com', verify='/path/to/certfile')
客户端证书
Requests 支持使用客户端证书进行双向认证:
# 使用客户端证书
requests.get('https://example.com', cert=('/path/client.cert', '/path/client.key'))
流式传输与分块编码
流式下载
对于大文件,可以使用流式下载避免内存问题:
r = requests.get('https://example.com/large_file', stream=True)
for chunk in r.iter_content(chunk_size=8192):
process_chunk(chunk)
流式上传
同样支持流式上传大文件:
with open('large_file', 'rb') as f:
requests.post('https://example.com/upload', data=f)
分块编码请求
def generate_data():
yield 'chunk1'
yield 'chunk2'
requests.post('https://example.com/upload', data=generate_data())
多文件上传
Requests 支持一次上传多个文件:
multiple_files = [
('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))
]
response = requests.post('https://example.com/upload', files=multiple_files)
事件钩子:请求过程的可扩展点
Requests 提供了钩子系统,允许你在请求过程中插入自定义逻辑:
def print_response_info(r, *args, **kwargs):
print(f'URL: {r.url}')
print(f'Status code: {r.status_code}')
requests.get('https://example.com', hooks={'response': print_response_info})
自定义认证机制
你可以实现自己的认证机制:
from requests.auth import AuthBase
class MyAuth(AuthBase):
def __call__(self, r):
# 修改请求
r.headers['X-Custom-Auth'] = 'my_token'
return r
requests.get('https://example.com/protected', auth=MyAuth())
通过掌握这些高级功能,你可以更灵活、高效地使用 Requests 库处理各种复杂的 HTTP 请求场景。无论是保持会话状态、处理大文件传输,还是实现自定义认证流程,Requests 都提供了简洁而强大的 API 支持。
requests A simple, yet elegant, HTTP library. 项目地址: https://gitcode.com/gh_mirrors/re/requests
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考