您的位置:

fastapi出现AsyncDependencyError()的解决方案

  发布时间:2023-01-30 19:30:01
报错的原因FastAPI会在运行时检测所有依赖项,如果发现有任何异步依赖项未在其所需的异步上下文中调用,则会引发这通常是由于在调用依赖项时缺少 await 关键字导致的。这可以确保依赖项在正确的异步上下文中运行,并且在使用它之前已经完成。所以运行这个程序会导致我们可以把这个例子中的get_current_time()函数改成异步函数,如下这样,就可以避免了。

报错的原因

FastAPI会在运行时检测所有依赖项,如果发现有任何异步依赖项未在其所需的异步上下文中调用,则会引发AsyncDependencyError。这通常是由于在调用依赖项时缺少 await 关键字导致的。

如何解决

解决此错误的方法是确保在调用异步依赖项时使用 await 关键字。这可以确保依赖项在正确的异步上下文中运行,并且在使用它之前已经完成。

例如,如果您正在使用一个异步函数作为依赖项,则应该在调用它时使用 await,而不是直接调用它:


@app.get("/items/{item_id}")
async def read_item(item_id: int, db: AsyncClient = Depends(get_db)):
    result = await db.fetch_item(item_id)
    return result

另外,FastAPI允许在依赖项定义中指定异步上下文,这样可以确保依赖项在正确的上下文中运行。


@app.get("/items/{item_id}")
async def read_item(item_id: int, db: AsyncClient = Depends(get_db, context=asynccontext())):
    result = await db.fetch_item(item_id)
    return result

如果上面的操作都没有解决问题,建议检查下是不是在依赖项中使用了同步函数,试着把同步函数转化成异步函数。

使用例子

当然,下面是一个使用同步函数作为依赖项的例子,它将导致 AsyncDependencyError


import time
from fastapi import FastAPI, Depends

app = FastAPI()

def get_current_time():
    return time.ctime()

@app.get("/time")
def read_time(current_time: str = Depends(get_current_time)):
    return {"time": current_time}

这里,我们使用了 time.ctime() 作为依赖项,它是一个同步函数,而不是异步函数。所以运行这个程序会导致 AsyncDependencyError

我们可以把这个例子中的get_current_time()函数改成异步函数,如下:


import asyncio

async def get_current_time():
    await asyncio.sleep(0.5)
    return time.ctime()

@app.get("/time")
async def read_time(current_time: str = Depends(get_current_time)):
    return {"time": current_time}

这样,就可以避免 AsyncDependencyError 了。