解决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 了。