aiohttp模块如何使用
aiohttp 简介
aiohttp 是一个基于 Python 的异步 HTTP 客户端/服务器框架,构建于 asyncio 之上。它支持高性能的异步网络操作,适用于 Web 服务、爬虫、API 调用等场景。
核心功能
- HTTP 客户端:支持异步发送 HTTP 请求,处理响应。
- HTTP 服务器:提供异步 Web 服务器功能,支持路由、中间件等。
- WebSocket:支持客户端和服务端的 WebSocket 通信。
- Session 管理:通过
ClientSession
复用连接,提升性能。
安装
通过 pip 安装:
pip install aiohttp
异步 HTTP 客户端示例
以下是一个简单的异步 HTTP GET 请求示例:
import aiohttp
import asyncioasync def fetch_data(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():url = "https://httpbin.org/get"data = await fetch_data(url)print(data)asyncio.run(main())
关键点:
- 使用
ClientSession
管理 HTTP 连接。 response.text()
异步获取响应内容。
异步 HTTP 服务器示例
创建一个简单的 Web 服务器:
from aiohttp import webasync def handle(request):return web.Response(text="Hello, aiohttp!")app = web.Application()
app.add_routes([web.get("/", handle)])if __name__ == "__main__":web.run_app(app, port=8080)
路由与响应:
- 通过
web.get
定义路由。 web.Response
生成 HTTP 响应。
WebSocket 通信示例
客户端:
async def websocket_client():async with aiohttp.ClientSession() as session:async with session.ws_connect("ws://echo.websocket.org") as ws:await ws.send_str("Hello, WebSocket!")async for msg in ws:if msg.type == aiohttp.WSMsgType.TEXT:print(f"Received: {msg.data}")
服务端:
async def websocket_handler(request):ws = web.WebSocketResponse()await ws.prepare(request)async for msg in ws:if msg.type == aiohttp.WSMsgType.TEXT:await ws.send_str(f"Echo: {msg.data}")app.add_routes([web.get("/ws", websocket_handler)])
性能优化建议
- 复用
ClientSession
:避免频繁创建/关闭会话,减少开销。 - 连接池限制:通过
connector
参数调整连接池大小。 - 超时设置:使用
timeout
参数避免请求阻塞。
示例:
timeout = aiohttp.ClientTimeout(total=10)
connector = aiohttp.TCPConnector(limit=20)
async with aiohttp.ClientSession(timeout=timeout, connector=connector) as session:...
常见问题
- 协程未执行:确保调用
asyncio.run()
或事件循环启动。 - 连接泄露:检查是否未关闭
ClientSession
或响应对象。 - SSL 错误:添加
ssl=False
参数(仅测试环境)。
通过上述方法和示例,可以快速上手 aiohttp 的异步 HTTP 和 WebSocket 开发。