事件:启动 - 关闭¶
FastAPI 支持定义在应用启动前,或应用关闭后执行的事件处理器(函数)。
事件函数既可以声明为异步函数(async def
),也可以声明为普通函数(def
)。
警告
FastAPI 只执行主应用中的事件处理器,不执行子应用 - 挂载中的事件处理器。
startup
事件¶
使用 startup
事件声明 app
启动前运行的函数:
from fastapi import FastAPI
app = FastAPI()
items = {}
@app.on_event("startup")
async def startup_event():
items["foo"] = {"name": "Fighters"}
items["bar"] = {"name": "Tenders"}
@app.get("/items/{item_id}")
async def read_items(item_id: str):
return items[item_id]
本例中,startup
事件处理器函数为项目数据库(只是字典)提供了一些初始值。
FastAPI 支持多个事件处理器函数。
只有所有 startup
事件处理器运行完毕,FastAPI 应用才开始接收请求。
shutdown
事件¶
使用 shutdown
事件声明 app
关闭时运行的函数:
from fastapi import FastAPI
app = FastAPI()
@app.on_event("shutdown")
def shutdown_event():
with open("log.txt", mode="a") as log:
log.write("Application shutdown")
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
此处,shutdown
事件处理器函数在 log.txt
中写入一行文本 Application shutdown
。
说明
open()
函数中,mode="a"
指的是追加。因此这行文本会添加在文件已有内容之后,不会覆盖之前的内容。
提示
注意,本例使用 Python open()
标准函数与文件交互。
这个函数执行 I/O(输入/输出)操作,需要等待内容写进磁盘。
但 open()
函数不支持使用 async
与 await
。
因此,声明事件处理函数要使用 def
,不能使用 asnyc def
。
说明
有关事件处理器的详情,请参阅 Starlette 官档 - 事件。