pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.6 KiB
44 lines
1.6 KiB
from __future__ import annotations
|
|
|
|
from contextlib import AsyncExitStack
|
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List
|
|
|
|
from fastapi.dependencies.models import LifespanDependant, LifespanDependantCacheKey
|
|
from fastapi.dependencies.utils import solve_lifespan_dependant
|
|
from fastapi.routing import APIRoute, APIWebSocketRoute
|
|
|
|
if TYPE_CHECKING: # pragma: nocover
|
|
from fastapi import FastAPI
|
|
|
|
|
|
def _get_lifespan_dependants(app: FastAPI) -> List[LifespanDependant]:
|
|
lifespan_dependants_cache: Dict[LifespanDependantCacheKey, LifespanDependant] = {}
|
|
for route in app.router.routes:
|
|
if not isinstance(route, (APIWebSocketRoute, APIRoute)):
|
|
continue
|
|
|
|
for sub_dependant in route.lifespan_dependencies:
|
|
if sub_dependant.cache_key in lifespan_dependants_cache:
|
|
continue
|
|
|
|
lifespan_dependants_cache[sub_dependant.cache_key] = sub_dependant
|
|
|
|
return list(lifespan_dependants_cache.values())
|
|
|
|
|
|
async def resolve_lifespan_dependants(
|
|
*, app: FastAPI, async_exit_stack: AsyncExitStack
|
|
) -> Dict[LifespanDependantCacheKey, Callable[..., Any]]:
|
|
lifespan_dependants = _get_lifespan_dependants(app)
|
|
dependency_cache: Dict[LifespanDependantCacheKey, Callable[..., Any]] = {}
|
|
for lifespan_dependant in lifespan_dependants:
|
|
solved_dependency = await solve_lifespan_dependant(
|
|
dependant=lifespan_dependant,
|
|
dependency_overrides_provider=app,
|
|
dependency_cache=dependency_cache,
|
|
async_exit_stack=async_exit_stack,
|
|
)
|
|
|
|
dependency_cache.update(solved_dependency.dependency_cache)
|
|
|
|
return dependency_cache
|
|
|