如何将requests的HTTPAdapter重构适配到aiohttp异步HTTP客户端使用
aiohttp实现requests自定义HTTPAdapter功能的方案
aiohttp没有提供和requests中HTTPAdapter完全对等的组件,你场景中自定义TLS配置的需求,可以通过自定义SSL上下文配合TCPConnector实现,和原有TlsAdapter效果完全一致。
具体实现代码
1. 常量与SSL上下文构造
import ssl import asyncio import aiohttp CIPHERS = ':'.join([ 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305', 'ECDHE-RSA-CHACHA20-POLY1305', 'DHE-RSA-AES128-GCM-SHA256', 'DHE-RSA-AES256-GCM-SHA384', 'DHE-RSA-CHACHA20-POLY1305', 'ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-SHA256', 'ECDHE-ECDSA-AES128-SHA', 'ECDHE-RSA-AES128-SHA', 'ECDHE-ECDSA-AES256-SHA384', 'ECDHE-RSA-AES256-SHA384', 'ECDHE-ECDSA-AES256-SHA', 'ECDHE-RSA-AES256-SHA', 'DHE-RSA-AES128-SHA256', 'DHE-RSA-AES256-SHA256', 'AES128-GCM-SHA256', 'AES256-GCM-SHA384', 'AES128-SHA256', 'AES256-SHA256', 'AES128-SHA', 'AES256-SHA', 'DES-CBC3-SHA' ]) # 构造和原有TlsAdapter功能一致的SSL上下文 def create_custom_ssl_context(ssl_options=0): ctx = ssl.create_default_context() ctx.set_ciphers(CIPHERS) ctx.verify_mode = ssl.CERT_REQUIRED ctx.options |= ssl_options return ctx
2. 调用方式(对应原有mount逻辑)
将构造好的SSL上下文传入aiohttp.TCPConnector,即可实现全局生效的TLS配置,等价于你原来给https://前缀挂载自定义Adapter的效果:
async def main(): # 禁用TLS1.0和TLS1.1,和原有参数一致 custom_ssl = create_custom_ssl_context(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1) # 创建异步会话时传入自定义配置的连接器 async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=custom_ssl)) as session: # 后续所有请求都会自动使用自定义的TLS配置 async with session.get("https://example.com") as resp: print(resp.status, await resp.text()) if __name__ == "__main__": asyncio.run(main())
其他扩展说明
如果你原有自定义Adapter还有额外的配置需求,可以对应调整TCPConnector的参数:
- 连接池大小调整:修改
TCPConnector的limit参数即可自定义并发连接上限 - 单请求特殊配置:不需要全局生效的话,可以直接在
session.get/post等方法中传入ssl=custom_ssl参数,仅对当前请求生效 - 代理、超时等配置均可以通过
ClientSession和TCPConnector的对应参数实现
内容的提问来源于stack exchange,提问作者asdasd31
相关产品推荐
相关产品推荐

