ASGI“寿命”协议似乎不受支持
Posted
技术标签:
【中文标题】ASGI“寿命”协议似乎不受支持【英文标题】:ASGI 'lifespan' protocol appears unsupported 【发布时间】:2021-02-07 05:51:06 【问题描述】:我在 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)
有什么想法问题出在哪里?
【问题讨论】:
【参考方案1】:这 99% 意味着 on_event("shutdown")
函数中的某些内容引发了服务器未捕获的错误 (FastAPI/Starlette),并且应用程序崩溃,而不是正常结束。这导致 uvicorn 认为服务器不支持 ASGI 协议的生命周期部分。
如果您使用附加选项--lifespan on
运行uvicorn
,则会显示错误并且您可以对其进行调试。
见Starlette bug report。
【讨论】:
【参考方案2】:这只是一个你可以省略的断言,据我了解,你使用 Uvicorn 作为 HTTP 服务器,因为 FastAPI 构建在 ASGI 框架之上,而 Uvicorn 是一个 ASGI HTTP 服务器,上面有一些协议. ASGI协议支持http、websocket。
Uvicorn 将 lifespan 的值设置为 auto
并且断言来自那里。
if self.config.lifespan == "auto":
msg = "ASGI 'lifespan' protocol appears unsupported."
但是你可以使用--lifespan on
来解决这个问题。
【讨论】:
恐怕我没有完全理解你的答案..在哪里以及如何使用它 当你使用 uvicorn 运行你的应用时,使用额外的--lifespan on
标志,例如uvicorn main:app --lifespan on
这个“寿命”究竟是什么?它有什么特别的作用吗?
@eekit 这是一个协议,是 ASGI 规范的一部分。见:asgi.readthedocs.io/en/latest/specs/lifespan.html以上是关于ASGI“寿命”协议似乎不受支持的主要内容,如果未能解决你的问题,请参考以下文章
Wireguard 拒绝在 Fedora 31 上运行:协议不受支持
配置ssl使用了不受支持的协议。 ERR_SSL_VERSION_OR_CIPHER_MISMATCH