我在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)
有什么问题吗?
答案 0 :(得分:9)
这 99% 意味着 on_event("shutdown")
函数中的某些内容引发了服务器 (FastAPI/Starlette) 未捕获的错误,并且应用程序崩溃,而不是正常结束。这导致 uvicorn 相信服务器不支持 ASGI 协议的 livespan 部分。
如果您运行带有附加选项 uvicorn
的 --lifespan on
,将会显示错误并且您可以对其进行调试。
答案 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
来解决此问题。