Requests 高级用法详解:从会话管理到自定义认证

Requests 高级用法详解:从会话管理到自定义认证

requests A simple, yet elegant, HTTP library. requests 项目地址: https://gitcode.com/gh_mirrors/re/requests

Requests 是 Python 中最受欢迎的 HTTP 客户端库之一,它简化了 HTTP 请求的发送过程。本文将深入探讨 Requests 库的一些高级功能,帮助开发者更高效地使用这个强大的工具。

会话对象:提升请求效率的利器

会话(Session)对象是 Requests 中一个极其有用的功能,它允许你在多个请求之间保持某些参数和状态。使用会话对象可以带来以下优势:

  1. 持久化参数:可以在会话级别设置参数,这些参数会自动应用到该会话的所有请求中
  2. Cookie 保持:自动处理 Cookie,无需手动管理
  3. 连接池:重用底层 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() 等方法时,实际上发生了两件事:

  1. 构造一个 Request 对象,包含所有请求信息
  2. 服务器返回响应后,生成一个 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. requests 项目地址: https://gitcode.com/gh_mirrors/re/requests

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔如黎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值