ASGI“寿命”协议似乎不受支持

时间:2020-10-24 10:17:43

标签: fastapi python-aiofiles

我在fastapi和aiofiles上运行异步代码 我试图从.json文件加载并保存我的信息,但是每次我关闭程序时,它仅保存字典的键,并显示“ 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)

有什么问题吗?

2 个答案:

答案 0 :(得分:9)

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

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

Starlette bug report

答案 1 :(得分:0)

这只是断言,就我所知,您将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来解决此问题。