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

WSGI&ASGI

WSGI&ASGI

客户端正在使用不受支持的 Socket.IO 或 Engine.IO 协议版本错误

将 --http2.0 选项与 curl 7.33.0 一起使用会提供不受支持的协议