aiohttp:Python 异步 HTTP 开发全搞定

aiohttp 在 GitHub 上已经拿到 16.4K Star 了。

这是 Python 生态里成熟的异步 HTTP 框架,同时支持客户端和服务端两种场景,原生带 WebSocket 能力,不用额外依赖其他组件。

1、这玩意儿是干嘛的

核心功能覆盖 HTTP 协议的两端:

  • 做客户端可以发送异步 HTTP 请求,适合写高并发爬虫、数据采集工具
  • 做服务端可以搭建 Web 应用,自带中间件和可插拔路由系统
  • WebSocket 支持开箱即用,客户端和服务端都不用额外适配,避免回调地狱问题

正文顶部截图

2、用它能省多少事

之前做 Python 异步开发,客户端可能要用 aiohttp,服务端可能要换 FastAPI 或者其他框架,WebSocket 还要单独找库。aiohttp 把这些场景都覆盖了,一套 API 就能搞定所有异步 HTTP 相关的开发。

它的性能经过多年优化,在 Python 异步框架里属于第一梯队,生产环境也有大量应用案例。依赖只有三个核心库,体积小,安装快,不会引入不必要的依赖。

README区域截图

3、基础使用示例

安装直接用 pip:

pip install aiohttp

如果需要更快的 DNS 解析,可以额外安装 aiodns:

pip install aiodns

客户端用法

发送异步 HTTP 请求的示例:

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:
            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])
            html = await response.text()
            print("Body:", html[:15], "...")

asyncio.run(main())

服务端用法

搭建简单 Web 服务的示例:

from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    return web.Response(text=text)

async def wshandle(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    async for msg in ws:
        if msg.type == web.WSMsgType.text:
            await ws.send_str("Hello, {}".format(msg.data))
        elif msg.type == web.WSMsgType.binary:
            await ws.send_bytes(msg.data)
        elif msg.type == web.WSMsgType.close:
            break
    return ws

app = web.Application()
app.add_routes([
    web.get('/', handle),
    web.get('/echo', wshandle),
    web.get('/{name}', handle)
])

if __name__ == '__main__':
    web.run_app(app)

4、适合哪些人用

  • 写高并发异步爬虫、数据采集工具的开发者
  • 搭建异步 Web 服务、API 接口的后端工程师
  • 需要实现 WebSocket 实时通信功能的场景
  • 用 Python 做异步应用开发的团队

、数据采集工具的开发者

  • 搭建异步 Web 服务、API 接口的后端工程师
  • 需要实现 WebSocket 实时通信功能的场景
  • 用 Python 做异步应用开发的团队

更多推荐