fastapi坑--fastapi 书写EventSourceResponse 迭代器的时候一定要加sleep

Posted xunhanliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fastapi坑--fastapi 书写EventSourceResponse 迭代器的时候一定要加sleep相关的知识,希望对你有一定的参考价值。

 一定要加sleep ,否则 sse_starlette.sse   中 listen_for_disconnect 收不到 http.disconnect 信号。这个表现是服务端的sse传输不会结束,会一直传递下去(虽然客户端 close或者disconnect)。

FastAPI 异步类依赖

【中文标题】FastAPI 异步类依赖【英文标题】:FastAPI async class dependencies 【发布时间】:2020-12-10 23:08:30 【问题描述】:

在 FastAPI 中,当标准函数用作依赖项时,它可以声明为常规 def 函数或异步 async def 函数。 FastAPI 声称它在任何一种情况下都会做正确的事情。

但是,以这种方式创建的依赖项不像类依赖项那样对自动完成友好。此外,类依赖项有更好的声明语法,只需指定一次依赖项的类型,FastAPI 就会找出您指的是哪个依赖项。

def read_item(common: CommonQueryParam = Depends()):

但是类依赖需要执行异步操作作为其初始化的一部分。是否可以一起使用类依赖项和异步。显然,不能将__init__ 类函数声明为异步。有没有其他方法可以让它工作?

【问题讨论】:

【参考方案1】:

正如您正确注意到的,__init__ 必须是同步的,您不能直接在其中调用 await。但是您可以将所有异步代码作为子依赖项并将其作为__init__ 的输入。 FastAPI 将正确处理这种异步依赖。

示例:

async def async_dep():
    await asyncio.sleep(0)
    return 1


class CommonQueryParams:
    def __init__(self, a: int = Depends(async_dep)):
        self.a = a

【讨论】:

以上是关于fastapi坑--fastapi 书写EventSourceResponse 迭代器的时候一定要加sleep的主要内容,如果未能解决你的问题,请参考以下文章

python框架fastapi, AttributeError: module 'asyncio' has no attribute 'iscoroutinefunction&

FastAPI 1:安装FastAPI

FastAPI 学习之路请求体有多个参数如何处理?

FastAPI 学习之路路径参数和数值的校验

FastAPI 学习之路字符串的校验

fastapi nodejs 性能比较