使用aiohttp
构建异步Web服务入门
为什么选择它?
在 Python 的异步编程世界里,asyncio 是标准库中单线程并发 I/O 的核心框架。而 aiohttp 则是这个生态下最成熟的 异步 HTTP 客户端 + 服务器双端库。如果你写惯了 Flask、django 这类同步框架,可能会觉得高并发只能靠多线程/多进程硬扛;但 aiohttp 不需要这些额外开销,就能用单线程轻松 hold 住上千个并发连接。
它的主要优势:
- 轻量高并发:完全异步非阻塞,内存占用远低于同步多线程方案。
- 原生长连接支持:对 WebSocket、SSE 等实时通信场景支持良好。
- 全双工 HTTP:既能写服务器,也能当 HTTP 客户端,一套依赖解决前后端通信。
- 生态友好:与
asyncio深度集成,可搭配uvloop、aiohttp-session、aiohttp-jinja2等扩展。
非常适合用来构建 API 网关、实时消息推送、异步爬虫服务、BFF 层等 I/O 密集型应用。
环境准备
-
基础要求
Python 3.7 及以上版本(asyncio在 3.7 后引入了更简洁的async/await语法增强和更稳定的事件循环实现,推荐直接上 3.10+)。 -
安装 aiohttp
如果后续需要性能调优,可以一并安装
uvloop和gunicorn,但入门阶段只需aiohttp。
第一个异步Web服务器
让我们从一个最精简但功能完整的双路由服务器开始:
/→ 返回一个带标题的 HTML 首页/{nickname}→ 根据 URL 中的昵称返回个性化问候
运行后,终端会输出类似:
浏览器访问 http://localhost:8080/ 和 http://localhost:8080/Alice,就能看到对应的问候页面了。
代码细节拆解
1. 异步处理函数
- 必须是
async def:这样事件循环才能自由调度它,不会阻塞主线程。 - 强制接收
web.Request对象:该对象包含了所有请求信息——URL、请求头、Body、Cookie 等,处理逻辑都从这里开始。 - 必须返回
web.Response或其子类:不能直接返回字符串或字典,必须显式构造响应对象。常用的还有web.json_response()、web.FileResponse()等。
2. 路由配置
- 创建应用核心:
web.Application()是整个服务的“大脑”。 - 添加路由:支持
web.get()、web.post()、web.put()、web.delete()、web.patch()等方法,也可以使用app.router.add_route()统一注册。 - 批量 vs 单条:示例中用了
add_routes()批量添加,适合路由较多时;少量路由也可以用app.router.add_get()等单独添加。 - URL 占位符:
{nickname}是动态部分,会自动注入到request.match_info中,还可以加正则约束,例如{nickname:\w+}只匹配字母数字下划线。
3. 应用工厂函数
示例中特意用 make_app() 而不是直接全局创建 app,这是生产环境的常见实践:
- 隔离环境:可以为测试/开发/生产分别创建不同配置的实例。
- 避免全局状态:避免模块级变量带来的隐式依赖。
- 易于部署集成:与 Gunicorn、uWSGI 等服务器配合时,它们会调用这个工厂函数来获取应用实例。
运行与快速测试
1. 本地启动
控制台会打印监听地址,按 Ctrl+C 即可停止服务。
2. 浏览器 / 命令行访问
- 浏览器
首页:http://localhost:8080/
动态页:http://localhost:8080/Alice - 命令行
curl测试你会看到返回的 HTML 内容,说明服务已经正常工作了。
几个常用的高级配置
自定义监听端口和地址
开发时可能只想本机访问,或者避开端口冲突:
快速返回 JSON 响应
aiohttp 内置了 json_response,无需手动设置 Content-Type 和序列化:
路由中加上 web.get("/api", handle_api) 即可,客户端会收到标准的 JSON 字符串。
添加中间件
中间件可以对所有请求执行前置/后置统一逻辑,比如日志记录、权限校验、跨域设置等:
现在每个请求都会在终端输出请求路径和最终响应码,非常便于调试。
生产环境部署建议
-
不要直接用
web.run_app()上线
它自带的服务器仅适合开发调试,性能和稳定性不足以应对线上流量。 -
推荐组合:Gunicorn + uvloop
app:make_app表示从app模块导入make_app工厂函数。GunicornUVLoopWebWorker会自动用uvloop替换默认事件循环,性能可提升 2~4 倍。- worker 数量一般设置为 CPU 核心数的 2 倍(视业务 I/O 密集程度调整)。
-
反向代理
在前面再挂一层 Nginx,负责静态文件处理、SSL 终结、负载均衡和请求缓冲,让 Python 进程专注于动态逻辑。
总结
通过这篇教程,你掌握了 aiohttp 服务器端的核心用法:
- 如何定义异步路由并返回 HTML / JSON 响应。
- 如何利用中间件处理通用逻辑。
- 如何为生产环境准备部署方案。
aiohttp 的能力远不止于此,它还内置了客户端(可用于异步爬虫)、WebSocket 支持,以及丰富的第三方扩展(如模板引擎、Session 管理)。如果你的项目需要轻量、高效、异步优先的 Web 服务,aiohttp 会是一个极佳的选择。

