python runtime_error ai_generated true

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

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

Also available as: JSON · Markdown · 中文
80%Fix Rate
82%Confidence
0Evidence
2024-03-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
3.10 active
3.11 active

Root Cause

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

generic

中文

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

Workarounds

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

Dead Ends

Common approaches that don't work:

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

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

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

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