跳至主要內容

高级用户指南

大约 1 分钟

高级用户指南


启动和停止事件

Events: startup - shutdown - FastAPI (tiangolo.com)open in new window


你可以定义 event handlers(functions) 让其在应用程序启动前,或在应用程序关闭时执行。

这些函数可以是同步的也可以是异步的

需要注意的是你只能在 main application 中定义这种函数而不能在 sub applicationopen in new window 中定义它们


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