You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Python Requests库获取实际发送的原始请求头?适配aiohttp

问题描述

我有一段可正常运行的Requests代码,使用requests_AWS4auth连接AWS:

from requests_aws4auth import AWS4Auth
aws4auth = AWS4Auth(access_key, secret_key, 'us-east-1', 's3')
response = requests.put(
    url,
    auth=aws4auth,
    data=content)

现在想将其迁移到aiohttp和asyncio环境中,但aiohttp仅原生支持用户名/密码认证,因此需要手动传入请求头。

我尝试从response对象中获取请求头,但其中只有响应头,并非所需的请求头。我尝试创建如下requests.Request对象:

request = requests.Request("put",
                           url,
                           auth= aws4auth,
                           data=content)

但该对象仅包含aws4auth实例,headers字段为空。我想了解如何获取实际发送到网络的请求内容,是否可行?

解决方案

不需要依赖requests发送请求,直接调用AWS4Auth的签名方法就能拿到带签名的请求头,步骤如下:

  1. 构造请求核心参数,生成预处理的请求对象
  2. 调用AWS4Auth的签名方法生成完整请求头

示例代码:

from requests_aws4auth import AWS4Auth
import requests

# 初始化AWS认证对象
aws4auth = AWS4Auth(access_key, secret_key, 'us-east-1', 's3')

# 定义请求参数
method = 'PUT'
url = '你的S3对象URL'
content = b'你的内容数据'

# 生成预处理请求对象,自动处理Content-Length等基础头
req = requests.Request(method, url, data=content)
prepared_req = req.prepare()

# 调用AWS4Auth签名方法,得到带签名的完整请求头
signed_headers = aws4auth(prepared_req)

拿到签名头后,直接在aiohttp中使用:

import aiohttp
import asyncio

async def upload_to_s3():
    async with aiohttp.ClientSession() as session:
        async with session.put(
            url,
            data=content,
            headers=signed_headers
        ) as resp:
            print(await resp.text())

asyncio.run(upload_to_s3())

关键说明:

  • requests.Request.prepare()会自动处理请求体、Content-Length等基础请求头,为AWS签名提供必要参数
  • AWS4Auth的__call__方法接收预处理请求对象,直接返回签名后的完整请求头字典,完全适配aiohttp的参数要求
  • 整个过程不需要实际发送requests请求,就能拿到可用于异步场景的签名头

内容的提问来源于stack exchange,提问作者Brian Postow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:25:01