Browse Source

♻️ Refactor and simplify dependencies data structures with dataclasses (#12098)

pull/12099/head
Sebastián Ramírez 7 months ago
committed by GitHub
parent
commit
581aacc4a9
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 75
      fastapi/dependencies/models.py
  2. 2
      fastapi/dependencies/utils.py

75
fastapi/dependencies/models.py

@ -1,58 +1,37 @@
from typing import Any, Callable, List, Optional, Sequence from dataclasses import dataclass, field
from typing import Any, Callable, List, Optional, Sequence, Tuple
from fastapi._compat import ModelField from fastapi._compat import ModelField
from fastapi.security.base import SecurityBase from fastapi.security.base import SecurityBase
@dataclass
class SecurityRequirement: class SecurityRequirement:
def __init__( security_scheme: SecurityBase
self, security_scheme: SecurityBase, scopes: Optional[Sequence[str]] = None scopes: Optional[Sequence[str]] = None
):
self.security_scheme = security_scheme
self.scopes = scopes
@dataclass
class Dependant: class Dependant:
def __init__( path_params: List[ModelField] = field(default_factory=list)
self, query_params: List[ModelField] = field(default_factory=list)
*, header_params: List[ModelField] = field(default_factory=list)
path_params: Optional[List[ModelField]] = None, cookie_params: List[ModelField] = field(default_factory=list)
query_params: Optional[List[ModelField]] = None, body_params: List[ModelField] = field(default_factory=list)
header_params: Optional[List[ModelField]] = None, dependencies: List["Dependant"] = field(default_factory=list)
cookie_params: Optional[List[ModelField]] = None, security_requirements: List[SecurityRequirement] = field(default_factory=list)
body_params: Optional[List[ModelField]] = None, name: Optional[str] = None
dependencies: Optional[List["Dependant"]] = None, call: Optional[Callable[..., Any]] = None
security_schemes: Optional[List[SecurityRequirement]] = None, request_param_name: Optional[str] = None
name: Optional[str] = None, websocket_param_name: Optional[str] = None
call: Optional[Callable[..., Any]] = None, http_connection_param_name: Optional[str] = None
request_param_name: Optional[str] = None, response_param_name: Optional[str] = None
websocket_param_name: Optional[str] = None, background_tasks_param_name: Optional[str] = None
http_connection_param_name: Optional[str] = None, security_scopes_param_name: Optional[str] = None
response_param_name: Optional[str] = None, security_scopes: Optional[List[str]] = None
background_tasks_param_name: Optional[str] = None, use_cache: bool = True
security_scopes_param_name: Optional[str] = None, path: Optional[str] = None
security_scopes: Optional[List[str]] = None, cache_key: Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] = field(init=False)
use_cache: bool = True,
path: Optional[str] = None, def __post_init__(self) -> None:
) -> None:
self.path_params = path_params or []
self.query_params = query_params or []
self.header_params = header_params or []
self.cookie_params = cookie_params or []
self.body_params = body_params or []
self.dependencies = dependencies or []
self.security_requirements = security_schemes or []
self.request_param_name = request_param_name
self.websocket_param_name = websocket_param_name
self.http_connection_param_name = http_connection_param_name
self.response_param_name = response_param_name
self.background_tasks_param_name = background_tasks_param_name
self.security_scopes = security_scopes
self.security_scopes_param_name = security_scopes_param_name
self.name = name
self.call = call
self.use_cache = use_cache
# Store the path to be able to re-generate a dependable from it in overrides
self.path = path
# Save the cache key at creation to optimize performance
self.cache_key = (self.call, tuple(sorted(set(self.security_scopes or [])))) self.cache_key = (self.call, tuple(sorted(set(self.security_scopes or []))))

2
fastapi/dependencies/utils.py

@ -175,7 +175,7 @@ def get_flat_dependant(
header_params=dependant.header_params.copy(), header_params=dependant.header_params.copy(),
cookie_params=dependant.cookie_params.copy(), cookie_params=dependant.cookie_params.copy(),
body_params=dependant.body_params.copy(), body_params=dependant.body_params.copy(),
security_schemes=dependant.security_requirements.copy(), security_requirements=dependant.security_requirements.copy(),
use_cache=dependant.use_cache, use_cache=dependant.use_cache,
path=dependant.path, path=dependant.path,
) )

Loading…
Cancel
Save