您的位置:

解决SyncDependencyError()在fastapi出现报错

  发布时间:2023-01-31 04:30:02
报错的原因FastAPI会在运行时检测所有依赖项,如果发现有任何同步依赖项在异步上下文中调用,则会引发这通常是由于在调用依赖项时使用了 await 关键字导致的。如果出现这种错误,需要确保在使用同步函数时不要使用await关键字。所以运行这个程序会导致我们可以把这个例子中的get_current_time()函数改成同步函数,如下或者使用FastAPI提供的来指定依赖项是同步的这样,就可以避免了。

报错的原因

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

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


def get_current_time():
    return time.ctime()

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

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

如果出现这种错误,需要确保在使用同步函数时不要使用await关键字。

如何解决

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

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


def get_current_time():
    return time.ctime()

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

另外,可以使用FastAPI提供的 `FastAPI.sync_dependency()` 来指定依赖项是同步的。


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

另外,建议检查下是不是在依赖项中使用了异步函数,试着把异步函数转化成同步函数。

使用例子

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


import asyncio
from fastapi import FastAPI, Depends

app = FastAPI()

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

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

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

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


def get_current_time():
    return time.ctime()

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

或者使用FastAPI提供的 `FastAPI.sync_dependency()` 来指定依赖项是同步的。


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

这样,就可以避免 SyncDependencyError 了。