11from functools import partial
22from pathlib import Path
33
4+ import pkg_resources
45from fastapi import APIRouter , FastAPI
5- from prometheus_fastapi_instrumentator import PrometheusFastApiInstrumentator
6- from starlette .middleware .trustedhost import TrustedHostMiddleware
76from starlette .staticfiles import StaticFiles
87
98from .conf import settings
109from .docs .views import router as docs_router
1110
11+ installed_packages = pkg_resources .working_set
12+ installed_packages_list = [f"{ i .key } " for i in installed_packages ]
13+
1214APP_ROOT = Path (__file__ ).parent
1315
1416
@@ -20,16 +22,14 @@ def include_docs_router(app: FastAPI, router: APIRouter) -> None:
2022
2123
2224def setup_prometheus (app : FastAPI ) -> None :
23- # TODO: проверить, что prometheus-fastapi-instrumentator установлен
2425 print ("===> settings.PROMETHEUS_ENABLED" , settings .PROMETHEUS_ENABLED )
25- if settings .PROMETHEUS_ENABLED :
26+ if settings .PROMETHEUS_ENABLED and "prometheus-fastapi-instrumentator" in installed_packages_list :
27+ from prometheus_fastapi_instrumentator import PrometheusFastApiInstrumentator
28+
2629 instrumentator = PrometheusFastApiInstrumentator (should_group_status_codes = False )
2730 instrumentator = instrumentator .instrument (app )
2831 instrumentator .expose (
29- app ,
30- should_gzip = settings .PROMETHEUS_SHOULD_GZIP ,
31- name = settings .PROMETHEUS_NAME ,
32- tags = ["Метрики" ]
32+ app , should_gzip = settings .PROMETHEUS_SHOULD_GZIP , name = settings .PROMETHEUS_NAME , tags = ["Метрики" ]
3333 )
3434 # TODO:
3535 # остальные настройки в settings
@@ -46,8 +46,9 @@ def setup_middlewares(app: FastAPI) -> None:
4646 for middleware in settings .MIDDLEWARES :
4747 print ("===> middleware" , middleware )
4848 app .add_middleware (middleware )
49- # TODO: продумать:
50- # преднастроенные миддлварь, которые задаются в строковом формате и имеют настройки ИЛИ не имеют параметров инициализации
49+ # TODO: продумать:
50+ # преднастроенные миддлварь, которые задаются в строковом формате и
51+ # имеют настройки ИЛИ не имеют параметров инициализации
5152 # callabe миддвари, с преднастроенными при помощи partial параметрами напр:
5253 # MIDDLEWARES = [
5354 # partial(TrustedHostMiddleware, allowed_hosts=["localhost", "*.example.com"])
@@ -61,10 +62,10 @@ def setup_middlewares(app: FastAPI) -> None:
6162 version = settings .API_VERSION ,
6263 docs_url = None ,
6364 redoc_url = None ,
64- openapi_url = f"{ settings .API_PREFIX } /docs/openapi.json"
65+ openapi_url = f"{ settings .API_PREFIX } /docs/openapi.json" ,
6566)
6667# TODO: настроить урлы
67- application .include_router = partial (application .include_router , prefix = settings .API_PREFIX )
68+ application .include_router = partial (application .include_router , prefix = settings .API_PREFIX ) # type: ignore
6869include_routers (application )
6970setup_prometheus (application )
7071setup_middlewares (application )
0 commit comments