【问题标题】:ASGI callable returned without starting responseASGI 可调用返回而不开始响应
【发布时间】:2021-05-14 20:24:02
【问题描述】:

我正在处理的 fastAPI 不会在请求失败时返回回溯,而是返回 500 Internal Server Error with error :

ERROR:    ASGI callable returned without starting response.
2021-05-14 16:12:08 - uvicorn.error:409 - ERROR - ASGI callable returned without starting response.

有人遇到过这个问题并知道解决方法吗?

【问题讨论】:

  • 能否包含您尝试调用的端点 api 代码?以及带有curl -Lv http://<yoursite>/? 的请求/响应标头?以及使用的fastapi、uvicorn、python的版本?
  • 也可以试试uvicorn your.app:app --log-level debug 给uvicorn添加日志级别调试,有什么变化吗?
  • @jmunsch 这是一个相当大的代码库,这就是为什么我没有在问题中包含代码。对于版本,fastapi==0.63.0, uvicorn==0.13.3, python 3.8
  • @jmunsch 我确实将日志记录级别设置为调试。它会注销调试信息。但是,我想在服务器失败时打印回溯。注销所有可能的错误是不可能的。
  • @jmunsch 我发现了 fastAPI 不返回回溯的原因,而是一个一般错误。这是由于我为此 API 创建的中间件。从 PrometheusMiddleware 子类化的中间件,在 Prometheus 指标中添加了一个额外的标签,并在 http 请求范围中添加了一个属性。我不知道为什么这会导致 fastAPI 无法正确返回 traceback 的问题。

标签: fastapi uvicorn asgi


【解决方案1】:

我的问题是由自定义中间件引起的。我已经能够更新中间件并修复此问题。

【讨论】:

    【解决方案2】:

    很可能您的中间件的__ call __ 方法不能正常工作。我建议检查中间件的构建并与您的进行比较。 例如:

        async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
        if scope["type"] != "http":
            await self.app(scope, receive, send)
            return
    
        request = Request(scope, receive=receive)
        response = await self.dispatch_func(request, self.call_next)
        await response(scope, receive, send)
    

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多