全局依赖关系作为每个处理程序的参数



在查看文档时,我以这种方式使用了我的应用程序设置:

import config
...
@router.post('')
async def my_handler(
...
settings: config.SettingsCommon = fastapi.Depends(config.get_settings),
):
...

但我不满足于到处重复import configconfig.get_settings

有没有一种方法可以在我的处理程序中使用settings而不重复我自己?

因为FastAPI关心帮助您最大限度地减少代码重复。

您可以使用fastapi_utils包中的基于类的视图。

例如:

from fastapi import APIRouter, Depends, FastAPI
from fastapi_utils.cbv import cbv
from starlette import requests
from logging import Logger
import config
from auth import my_auth
router = APIRouter(
tags=['Settings test'],
dependencies=[Depends(my_auth)]  # injected into each query, but my_auth return values are ignored, throw Exceptions
)

@cbv(router)
class MyQueryCBV:
settings: config.SettingsCommon = Depends(config.get_settings)  # you can get settings here
def __init__(self, r: requests.Request):  # called for each query, after their dependencies have been evaluated
self.logger: Logger = self.settings.logger
self.logger.warning(str(r.headers))
@router.get("/cbv/{test}")
def test_cbv(self, test: str):
self.logger.warning(f"test_cbv: {test}")
return "test_cbv"
@router.get("/cbv2")
def test_cbv2(self):
self.logger.warning(f"test_cbv2")
return "test_cbv2"

当前不可能注入全局依赖项。您仍然可以声明它们,依赖项中的代码将正常运行。

关于全局依赖项的文档以供参考。

在没有任何外部依赖的情况下,我可以想出三种使用全局依赖的方法。您可以使用依赖项设置一个私有变量,并使用函数获取该依赖项。

您也可以在不使用全局私有变量的情况下使用相同的方法,而是使用缓存装饰器(此处为docs(。

最后,如果使用类作为依赖项,则可以实现singleton模式。

类似于:

class Animal:
_singleton = None
@classmethod
def singleton(cls) -> "Animal":
if cls._singleton is None:
cls._singleton = Animal()
return cls._singleton

最新更新