高级用户指南
大约 1 分钟
高级用户指南
启动和停止事件
Events: startup - shutdown - FastAPI (tiangolo.com)
你可以定义 event handlers(functions)
让其在应用程序启动前,或在应用程序关闭时执行。
这些函数可以是同步的也可以是异步的
需要注意的是你只能在
main application
中定义这种函数而不能在 sub application 中定义它们
startup
事件
如果你需要在应用开始前执行一个函数, 那么可以使用 startup
事件来定义这样一个函数
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_event
函数初始化 items
字典
我们可以在应用启动前记录 uvicorn 产生的日志
import logging
@app.on_event("startup")
async def startup_event():
logger = logging.getLogger("uvicorn.access")
handler = logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes = 100*1024, backupCount = 3)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(handler)
这样记录的话, uvicorn 的输出就会记录在 api.log
中
shutdown
事件
与 startup
事件类似, 你也可以通过 shutdown
事件定义一个函数以在应用关闭后执行
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"}]
在此示例中, 在应用关闭后将会将 Application shutdown
写入到 log.txt
的末尾
需要注意的是, 在此事例中我们用到了
open
函数, 其不可以用于异步, 因此这里使用了def
而非async def