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