
本文详细介绍了如何在fastapi应用启动后,利用其内置的`lifespan`事件管理机制执行一次性初始化函数。通过`asynccontextmanager`装饰器定义生命周期函数,并将其传递给`fastapi`实例,可以确保特定任务(如数据加载、数据库连接初始化)在服务器开始处理请求前完成,从而实现对应用启动流程的精确控制。
在开发Web应用程序时,我们经常需要在服务器启动后、开始处理用户请求之前执行一些初始化任务。这些任务可能包括加载配置、初始化数据库连接、预加载数据到内存或启动后台服务等。对于FastAPI应用,直接在if __name__ == "__main__":块中调用函数可能无法满足“服务器启动后”的要求,因为这些函数会在Uvicorn启动之前执行,或者在Uvicorn启动后无法被调用。FastAPI提供了一个优雅的解决方案:lifespan事件管理。
FastAPI的lifespan机制允许开发者定义在应用启动和关闭时需要执行的异步任务。它通过Python的contextlib.asynccontextmanager装饰器实现,提供了一个清晰的上下文管理模式。
lifespan 函数是一个异步上下文管理器,其核心在于yield关键字。在yield之前执行的代码会在应用启动时运行,而yield之后(或yield块退出时)执行的代码则会在应用关闭时运行。这使得我们能够精确地控制初始化和清理操作的执行时机。
假设我们有一个名为 create_data 的函数,需要在FastAPI服务器启动后立即执行,以初始化全局数据。
import time
import uvicorn
from fastapi import FastAPI
from contextlib import asynccontextmanager
# 全局数据,将在启动时初始化
DATA = {"value": ""}
def create_data():
"""模拟一个耗时的数据初始化过程"""
print("开始执行数据初始化...")
time.sleep(2) # 模拟耗时操作
DATA["value"] = "Hello World from FastAPI!"
print("数据初始化完成。")
# 定义应用生命周期管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
FastAPI应用的生命周期管理函数。
在yield之前执行启动任务,在yield之后(或退出时)执行关闭任务。
"""
create_data() # 在应用启动时调用一次性初始化函数
print("FastAPI应用即将启动并接受请求...")
yield # 应用在此处开始接受请求
# yield之后的代码将在应用关闭时执行
print("FastAPI应用正在关闭...")
# 例如,可以在这里清理资源
DATA["value"] = "" # 清理数据
print("资源已清理。")
# 创建FastAPI应用实例,并注册lifespan事件
app = FastAPI(lifespan=lifespan)
@app.get("/")
def get_root():
"""
根路径接口,返回初始化后的数据。
"""
return DATA
if __name__ == "__main__":
print("启动Uvicorn服务器...")
uvicorn.run(app, host="0.0.0.0", port=8000)
print("Uvicorn服务器已停止。")
当你运行上述代码时,你会观察到以下输出顺序:
启动Uvicorn服务器...
开始执行数据初始化...
数据初始化完成。
FastAPI应用即将启动并接受请求...
INFO: Started reloader process [xxxxx] using WatchFiles
INFO: Started server process [xxxxx]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
# 此时服务器正在运行,你可以通过浏览器或curl访问 http://0.0.0.0:8000
# 访问后会返回 {"value": "Hello World from FastAPI!"}
# 当你按下 CTRL+C 停止服务器时:
INFO: Shutting down
INFO: Waiting for application shutdown.
FastAPI应用正在关闭...
资源已清理。
INFO: Application shutdown complete.
INFO: Finished server process [xxxxx]
INFO: Stopping reloader process [xxxxx]
Uvicorn服务器已停止。这清楚地表明 create_data() 在服务器开始接受请求之前完成执行,并且关闭逻辑在服务器停止后被触发。
FastAPI的 lifespan 事件管理机制提供了一种强大且优雅的方式来处理应用的启动和关闭任务。通过利用 asynccontextmanager 和 yield 关键字,开发者可以精确地控制初始化函数的执行时机,确保应用在处理请求前处于正确的状态,并在关闭时进行必要的资源清理,从而构建出更加健壮和专业的FastAPI应用。
以上就是如何在FastAPI服务器启动后执行一次性初始化函数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号