on_event 是 FastAPI 提供的一个装饰器,用于在特定的事件发生时执行特定的代码块。这些事件通常与应用的生命周期有关,如应用启动和关闭时。使用 on_event 装饰器可以确保在应用启动或关闭时执行一些初始化或清理操作。
在 FastAPI 中,常用的事件包括应用启动 (startup
) 和应用关闭 (shutdown
)。除了这两个事件,FastAPI 目前只原生支持这两个事件,但它们是处理应用生命周期内重要操作的主要工具。下面我们详细讲解这两个事件及其使用场景,此外,还介绍如何使用这些事件。
常用事件
-
startup
:应用启动时触发的事件。在应用第一次接收到请求之前,startup
事件会被触发。用于进行初始化操作,比如连接数据库、加载配置、启动后台任务等。 -
shutdown
:应用关闭时触发的事件。在应用关闭或重启之前,shutdown
事件会被触发。用于执行清理操作,比如关闭数据库连接、停止后台任务、释放资源等。
使用场景及示例
1. 应用启动事件 (startup
)
场景:需要在应用启动时执行一些初始化任务,比如连接数据库、加载配置或启动后台任务。
示例:在应用启动时连接到数据库,并在关闭时断开连接。
from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
app = FastAPI()
# 创建数据库引擎和会话工厂
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
@app.on_event("startup")
async def startup_event():
print("应用启动")
# 初始化数据库连接
# 例如,可以在这里运行数据库迁移操作
# async with engine.begin() as conn:
# await conn.run_sync(Base.metadata.create_all)
@app.on_event("shutdown")
async def shutdown_event():
print("应用关闭")
# 关闭数据库连接
# 例如,可以在这里断开数据库连接或停止后台任务
# engine.dispose()
@app.get("/")
async def read_root():
return {"message": "Hello World"}
2. 应用关闭事件 (shutdown
)
场景:需要在应用关闭时执行清理任务,如关闭数据库连接、停止后台任务、释放占用的资源等。
示例:在应用关闭时停止后台任务。
import asyncio
from fastapi import FastAPI
app = FastAPI()
background_task = None
@app.on_event("startup")
async def startup_event():
global background_task
print("应用启动")
# 启动一个后台任务
async def background_task_func():
while True:
print("后台任务运行中...")
await asyncio.sleep(5)
background_task = asyncio.create_task(background_task_func())
@app.on_event("shutdown")
async def shutdown_event():
print("应用关闭")
# 停止后台任务
if background_task:
background_task.cancel()
try:
await background_task
except asyncio.CancelledError:
print("后台任务已停止")
@app.get("/")
async def read_root():
return {"message": "Hello World"}
总结
FastAPI 目前主要支持 startup
和 shutdown
两个生命周期事件,这两个事件在应用的生命周期中扮演着重要角色。使用 startup
事件可以在应用启动时进行必要的初始化工作,而使用 shutdown
事件可以在应用关闭时进行资源清理。虽然 FastAPI 只原生支持这两个事件,但它们足够处理大多数应用的初始化和清理需求。