17

我在 fastapi 和 aiofiles 上运行了一个异步代码,我试图从 .json 文件加载和保存我的信息,但每次我关闭程序时,它只保存 dict 的键并向我显示“ASGI 'lifespan'协议似乎不受支持”按摩

这是我的开启/关闭部分:

@app.on_event("startup")
async def startup_event():
    global beers
    try:
        async with aiofiles.open("data.json", mode='r+', json=True) as file:
            beers = await file.read()
    except:
        beers = {}


@app.on_event("shutdown")
async def on_exit_app():
    async with aiofiles.open("data.json", "w+") as outfile:
        await outfile.write(beers)

任何想法问题出在哪里?

4

2 回答 2

21

这 99% 意味着on_event("shutdown")函数中的某些内容引发了服务器未捕获的错误(FastAPI/Starlette),并且应用程序崩溃,而不是正常结束。这导致 uvicorn 认为服务器不支持 ASGI 协议的生命周期部分。

如果您uvicorn使用附加选项运行--lifespan on,则会显示错误并且您可以对其进行调试。

请参阅Starlette 错误报告

于 2021-02-08T19:00:48.983 回答
2

这只是一个你可以忽略的断言,据我了解,你使用 Uvicorn 作为 HTTP 服务器,因为 FastAPI 是建立在 ASGI 框架之上的,而 Uvicorn 是一个 ASGI HTTP 服务器,它上面有一些协议。ASGI 协议支持 http、websocket。

Uvicorn 将生命周期的价值设置为auto,并且断言来自那里。

if self.config.lifespan == "auto":
    msg = "ASGI 'lifespan' protocol appears unsupported."

但是你可以用它--lifespan on来解决这个问题。

于 2020-10-24T10:55:16.227 回答