FastAPI和Uvicorn
目录
一、FastAPI和Uvicorn简介:框架 vs 服务器
-
FastAPI:是一个现代、高性能的 Web 框架,用于快速构建 API 接口。它基于 Python 的类型提示(type hints),能自动生成 API 文档,支持异步编程,并且兼容 OpenAPI 和 JSON Schema 规范。
-
Uvicorn:是一个基于 asyncio 的 ASGI 服务器,负责接收和处理 HTTP 请求,将请求转发给 Web 应用,并将应用的响应返回给客户端。它本身不处理业务逻辑,只是提供运行 Web 应用的环境。
二、为什么需要它们一起使用?
Web 应用的运行需要两个核心部分:
- 应用程序:定义业务逻辑(如路由、数据处理等)—— 这是 FastAPI 的工作。
- 服务器:负责网络通信(监听端口、接收请求、返回响应)—— 这是 Uvicorn 的工作。
类比来说:
- FastAPI 像“餐厅的厨师”,负责制作食物(处理业务逻辑)。
- Uvicorn 像“餐厅的服务员”,负责接待客人、传递订单和食物(处理网络通信)。
三、快速上手:FastAPI + Uvicorn 实战
1. 安装依赖
pip install fastapi uvicorn
2. 编写一个简单的 FastAPI 应用
创建文件 main.py
:
from fastapi import FastAPI
# 创建 FastAPI 应用实例
app = FastAPI()
# 定义路由:当访问根路径 "/" 时,执行下面的函数
@app.get("/")
async def read_root():
return {"message": "Hello, FastAPI + Uvicorn!"}
# 定义带参数的路由
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
3. 用 Uvicorn 运行应用
在命令行执行:
uvicorn main:app --reload
main:app
:指定运行main.py
文件中的app
实例(FastAPI 创建的应用)。--reload
:开发模式下自动重载,修改代码后无需手动重启服务器。
启动后,访问 http://127.0.0.1:8000
即可看到返回的 JSON 数据{"message":"Hello, FastAPI + Uvicorn!"}。
访问 http://127.0.0.1:8000/items/456
,会返回 {"item_id": 456, "query": null}。
访问 http://127.0.0.1:8000/items/456?q=hello
,会返回 {"item_id": 456, "query": "hello"}。特殊符合?
分隔了 URL 的路径部分和查询参数部分,被 FastAPI 自动解析并传递给函数的 q 参数。
四、FastAPI 好处多多
-
自动生成 API 文档:
- 访问
http://127.0.0.1:8000/docs
可查看交互式文档(基于 Swagger UI)。 - 访问
http://127.0.0.1:8000/redoc
可查看另一种风格的文档(基于 ReDoc)。
- 访问
-
类型提示与自动校验:
- 如上面代码中的
item_id: int
,FastAPI 会自动校验参数类型,不符合时返回清晰的错误信息。
- 如上面代码中的
-
异步支持:
- 函数前加
async
即可定义异步接口,配合 Uvicorn 的异步能力,性能大幅提升。
- 函数前加
-
轻量且强大:
- 兼容 Starlette(另一个异步框架),可直接使用其功能(如中间件、模板等)。
五、Uvicorn 的作用
-
作为 ASGI 服务器:
- 支持异步 Web 应用(ASGI 规范),比传统的 WSGI 服务器(如 Gunicorn)更适合处理高并发请求。
-
处理网络层细节:
- 监听指定的 IP 和端口(默认
127.0.0.1:8000
)。 - 解析 HTTP 请求,将其转换为应用可处理的格式(如
scope
、receive
、send
)。 - 将应用返回的响应转换为 HTTP 协议格式,发送给客户端。
- 监听指定的 IP 和端口(默认
-
生产环境配置:
- 用
--workers
指定工作进程数(如--workers 4
),利用多核 CPU 提高性能。 - 用
--host 0.0.0.0
允许外部设备访问(如部署到服务器时)。
- 用
六、总结
- FastAPI 负责定义 API 接口、处理业务逻辑、数据校验等“应用层”工作。
- Uvicorn 负责监听端口、接收请求、转发给应用、返回响应等“网络层”工作。
- 两者结合使用,既能快速开发高性能 API,又能可靠地运行在生产环境中。