python runtime_error ai_generated true

运行时错误:无法在同步应用中使用 ASGI 生命周期协议

RuntimeError: You cannot use the ASGI lifespan protocol with a sync application

ID: python/starlette-runtime-error-application-context

其他格式: JSON · Markdown 中文 · English
80%修复率
82%置信度
0证据数
2024-03-10首次发现

版本兼容性

版本状态引入弃用备注
3.10 active
3.11 active

根因分析

Starlette 应用被配置为异步生命周期,但应用本身是同步函数

English

Starlette 应用被配置为异步生命周期,但应用本身是同步函数

generic

解决方案

  1. 90% 成功率 将应用改为异步函数或使用同步生命周期
    app = Starlette(routes=routes)  # 使用同步应用
    或者
    async def app(scope, receive, send): ...
  2. 95% 成功率 使用 starlette.applications.Starlette 的 lifespan 参数
    async def lifespan(app):
        yield
    app = Starlette(routes=routes, lifespan=lifespan)

无效尝试

常见但无效的做法:

  1. 移除 lifespan 参数但保留 async def 应用 50% 失败

    应用仍为异步,但缺少生命周期管理,可能导致资源泄漏

  2. 使用 sync_to_async 包装应用但未正确配置 75% 失败

    包装后仍需要异步上下文,根本问题未解决