]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🐛 Fix using class (not instance) dependency that has `__call__` method (#14458)
authorMotov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Fri, 5 Dec 2025 21:21:05 +0000 (22:21 +0100)
committerGitHub <noreply@github.com>
Fri, 5 Dec 2025 21:21:05 +0000 (21:21 +0000)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
fastapi/dependencies/models.py
tests/test_dependency_class.py

index af168a177a6f7fd4e7c5fd2b5c4e9614982daf2e..6c4bf18b37b593f05ffd66b886238ac76a9d11d7 100644 (file)
@@ -110,6 +110,8 @@ class Dependant:
             _impartial(self.call)
         ) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):
             return True
+        if inspect.isclass(_unwrapped_call(self.call)):
+            return False
         dunder_call = getattr(_impartial(self.call), "__call__", None)  # noqa: B004
         if dunder_call is None:
             return False  # pragma: no cover
@@ -134,6 +136,8 @@ class Dependant:
             _impartial(self.call)
         ) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):
             return True
+        if inspect.isclass(_unwrapped_call(self.call)):
+            return False
         dunder_call = getattr(_impartial(self.call), "__call__", None)  # noqa: B004
         if dunder_call is None:
             return False  # pragma: no cover
@@ -162,6 +166,8 @@ class Dependant:
             _unwrapped_call(self.call)
         ):
             return True
+        if inspect.isclass(_unwrapped_call(self.call)):
+            return False
         dunder_call = getattr(_impartial(self.call), "__call__", None)  # noqa: B004
         if dunder_call is None:
             return False  # pragma: no cover
@@ -176,7 +182,6 @@ class Dependant:
             _impartial(dunder_unwrapped_call)
         ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):
             return True
-        # if inspect.isclass(self.call): False, covered by default return
         return False
 
     @cached_property
index 0233492e6ca2dca38913e52f6d1fb28846854466..75241b467ac9709e750df6c5c47e3ebbaf2fdc77 100644 (file)
@@ -48,6 +48,34 @@ async_callable_gen_dependency = AsyncCallableGenDependency()
 methods_dependency = MethodsDependency()
 
 
+@app.get("/callable-dependency-class")
+async def get_callable_dependency_class(
+    value: str, instance: CallableDependency = Depends()
+):
+    return instance(value)
+
+
+@app.get("/callable-gen-dependency-class")
+async def get_callable_gen_dependency_class(
+    value: str, instance: CallableGenDependency = Depends()
+):
+    return next(instance(value))
+
+
+@app.get("/async-callable-dependency-class")
+async def get_async_callable_dependency_class(
+    value: str, instance: AsyncCallableDependency = Depends()
+):
+    return await instance(value)
+
+
+@app.get("/async-callable-gen-dependency-class")
+async def get_async_callable_gen_dependency_class(
+    value: str, instance: AsyncCallableGenDependency = Depends()
+):
+    return await instance(value).__anext__()
+
+
 @app.get("/callable-dependency")
 async def get_callable_dependency(value: str = Depends(callable_dependency)):
     return value
@@ -114,6 +142,10 @@ client = TestClient(app)
         ("/synchronous-method-gen-dependency", "synchronous-method-gen-dependency"),
         ("/asynchronous-method-dependency", "asynchronous-method-dependency"),
         ("/asynchronous-method-gen-dependency", "asynchronous-method-gen-dependency"),
+        ("/callable-dependency-class", "callable-dependency-class"),
+        ("/callable-gen-dependency-class", "callable-gen-dependency-class"),
+        ("/async-callable-dependency-class", "async-callable-dependency-class"),
+        ("/async-callable-gen-dependency-class", "async-callable-gen-dependency-class"),
     ],
 )
 def test_class_dependency(route, value):