Depends
使用 Depends(func)
可以标注所依赖的可调用对象,在视图被调用前会调用并将返回值注入到视图的参数中。
Tip
你同样可以在这里进行参数标注,将会递归调用所有依赖的可调用对象以及需要注入的参数。
def get_name(name: Annotated[str, Query(...)]):
return name.lower()
def hello(name: Annotated[str, Depends(get_name)]):
return f"hello {name}"
比较特殊的是,如果你使用 Depends(......)
标注的可调用对象是一个生成器函数,那么它将会被 contextlib
改造,yield
值被注入视图中,清理部分在视图函数退出后执行(无论视图函数是正常返回或是抛出异常,均会执行清理过程)。在获取某些需要清理的资源时,这特别有效。
def get_db_connection():
connection = ... # get connection
try:
yield connection
finally:
connection.close()
def get_user(db: Annotated[Connection, Depends(get_db_connection)]):
...
异步依赖
如果你的依赖是异步的,你同样可以使用 Depends(func)
标注一个异步可调用对象,但请注意,这只能用在 ASGI 模式下。
Cache¶
默认情况下,同一个依赖函数只会在一次请求里被调用一次。如果想要同一个请求里每次都重新计算依赖函数,你可以使用 cache=False
。