FastAPI
FastAPI 学习笔记
fastapi/fastapi
https://github.com/fastapi/fastapi
官方中文文档
https://fastapi.tiangolo.com/zh/
简介
FastAPI 可以看做是 Starlette、Pydantic、OpenAPI 和 JSON Schema 粘合在一起:
- FastAPI 使用 Pydantic 进行数据验证,并使用 Starlette 作为工具,使其与 Flask 相比快得惊人,具有与 Node 或 Go 中的高速 Web APIs 相同的性能
- Starlette + Uvicorn 提供异步请求能力,这是 Flask 所缺乏的。
- 与 Flask 不同,FastAPI 没有内置的 ASGI Web 服务器,因此需要像 Uvicorn 或 Daphne 这样的 ASGI 服务器。
安装
安装 fastapi
pip install fastapi
此外,还需要安装一个 ASGI 服务器,常用 uvicorn
pip install "uvicorn[standard]"
最简单的 FastAPI 应用
1、创建 fastapi_server.py
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
2、启动 FastApi 服务
方法1,在 PyCharm 中点击 __main__
旁边的运行图标
方法2,或者命令行中 uvicorn fastapi_server:app --reload
运行
uvicorn fastapi_server:app --reload
INFO: Will watch for changes in these directories: ['/Users/masi/git/my/py/web']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [35948] using WatchFiles
INFO: Started server process [35975]
INFO: Waiting for application startup.
INFO: Application startup complete.
其中:fastapi_server
是 Python 模块名(即 Python 文件名)app
是通过 app = FastAPI()
创建的应用对象--reload
表示开启热更新,代码改动后会自动加载。仅在开发时使用该选项。
3、浏览器可打开 http://127.0.0.1:8000 可看到响应。
lifespan 生命周期
生命周期 lifespan
https://fastapi.tiangolo.com/zh/advanced/events/?h=#lifespan
FastAPI 的 lifespan 是一种用于统一管理应用生命周期事件(如启动和关闭)的机制,旨在替代旧版的 @app.on_event("startup")
和 @app.on_event("shutdown")
方法。
lifespan 通过 异步上下文管理器 实现,允许在一个函数中集中处理应用的启动初始化和关闭清理逻辑。这种方式解决了旧版方法中资源管理割裂的问题,例如:
- 启动阶段:加载配置文件、初始化数据库连接池、预加载机器学习模型等。
- 关闭阶段:释放数据库连接、保存日志、清理缓存资源等。
@asynccontextmanager 异步上下文管理器
FastAPI 的 lifespan 生命周期需结合 @asynccontextmanager
装饰器定义异步上下文管理器,并通过 yield 分隔启动和关闭逻辑。
@asynccontextmanager
是 Python 标准库 contextlib
提供的装饰器,用于将一个异步生成器函数转换为 异步上下文管理器。
其核心设计模式为:
- yield 前:执行资源初始化(如连接数据库、加载模型)。
- yield 后:执行资源清理(如关闭连接、释放内存)
@asynccontextmanager
装饰器适用于 任何需要异步资源管理的场景,例如:
- 数据库连接池:启动时创建连接池,关闭时释放。
- 机器学习模型:预加载模型到内存,结束时卸载。
- 网络请求会话:创建异步 HTTP 客户端,结束时关闭会话
定义 lifespan 函数
FastAPI 的 lifespan 是一种 应用生命周期管理接口,要求开发者通过 异步上下文管理器 @asynccontextmanager
实现:
1、使用 @asynccontextmanager
装饰一个函数,函数签名符合要求:必须接收 app: FastAPI 参数
2、将该函数作为参数传递给 FastAPI(lifespan=...)
代码示例:
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动逻辑(如初始化数据库)
print("应用启动,加载资源...")
await init_database()
yield
# 关闭逻辑(如释放资源)
print("应用关闭,清理资源...")
await close_database()
app = FastAPI(lifespan=lifespan)
reload=True 导致重复初始化
当 --reload
或 reload=True
启用时,uvicorn 会监控代码变化并重新加载整个应用,直接写在 if __name__ == "__main__":
外的初始化逻辑会被执行多次。
下面代码中,print(“初始化”) 会被执行多次:
import uvicorn
from fastapi import FastAPI
print("初始化")
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == "__main__":
uvicorn.run("fastapi_server:app", host="0.0.0.0", port=8000, reload=True)
启动日志:
初始化
INFO: Will watch for changes in these directories: ['/Users/masi/git/my/py/web']
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [84530] using WatchFiles
初始化
初始化
INFO: Started server process [84588]
INFO: Waiting for application startup.
INFO: Application startup complete.
依赖注入
依赖项
https://fastapi.tiangolo.com/zh/tutorial/dependencies/
下一篇 Java-线程与线程池
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: