]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
⚡️ Avoid flattening dependencies for request parameters, mainly for OpenAPI (#16073)
authorSebastián Ramírez <tiangolo@gmail.com>
Mon, 27 Jul 2026 16:17:33 +0000 (18:17 +0200)
committerGitHub <noreply@github.com>
Mon, 27 Jul 2026 16:17:33 +0000 (16:17 +0000)
fastapi/dependencies/utils.py

index 279926939781693d0e2de9bd2091100056d36a1a..dedb394327a8b3338668292410ce08763e4a205d 100644 (file)
@@ -242,11 +242,31 @@ def _get_flat_fields_from_params(fields: list[ModelField]) -> list[ModelField]:
 
 
 def get_flat_params(dependant: Dependant) -> list[ModelField]:
-    flat_dependant = get_flat_dependant(dependant, skip_repeats=True)
-    path_params = _get_flat_fields_from_params(flat_dependant.path_params)
-    query_params = _get_flat_fields_from_params(flat_dependant.query_params)
-    header_params = _get_flat_fields_from_params(flat_dependant.header_params)
-    cookie_params = _get_flat_fields_from_params(flat_dependant.cookie_params)
+    path_params: list[ModelField] = []
+    query_params: list[ModelField] = []
+    header_params: list[ModelField] = []
+    cookie_params: list[ModelField] = []
+    visited: list[DependencyCacheKey] = []
+    uses_scopes_cache: _UsesScopesCache = {}
+    dependants = [dependant]
+    while dependants:
+        current_dependant = dependants.pop()
+        cache_key = _get_cache_key(
+            dependant=current_dependant,
+            uses_scopes_cache=uses_scopes_cache,
+        )
+        if cache_key in visited:
+            continue
+        visited.append(cache_key)
+        path_params.extend(current_dependant.path_params)
+        query_params.extend(current_dependant.query_params)
+        header_params.extend(current_dependant.header_params)
+        cookie_params.extend(current_dependant.cookie_params)
+        dependants.extend(reversed(current_dependant.dependencies))
+    path_params = _get_flat_fields_from_params(path_params)
+    query_params = _get_flat_fields_from_params(query_params)
+    header_params = _get_flat_fields_from_params(header_params)
+    cookie_params = _get_flat_fields_from_params(cookie_params)
     return path_params + query_params + header_params + cookie_params