mirror of https://github.com/tiangolo/fastapi.git
🐛 Fix using class (not instance) dependency that has `__call__` method (#14458)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
parent
516169428d
commit
da0ffab0b2
|
|
@ -110,6 +110,8 @@ class Dependant:
|
||||||
_impartial(self.call)
|
_impartial(self.call)
|
||||||
) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):
|
) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):
|
||||||
return True
|
return True
|
||||||
|
if inspect.isclass(_unwrapped_call(self.call)):
|
||||||
|
return False
|
||||||
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
||||||
if dunder_call is None:
|
if dunder_call is None:
|
||||||
return False # pragma: no cover
|
return False # pragma: no cover
|
||||||
|
|
@ -134,6 +136,8 @@ class Dependant:
|
||||||
_impartial(self.call)
|
_impartial(self.call)
|
||||||
) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):
|
) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):
|
||||||
return True
|
return True
|
||||||
|
if inspect.isclass(_unwrapped_call(self.call)):
|
||||||
|
return False
|
||||||
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
||||||
if dunder_call is None:
|
if dunder_call is None:
|
||||||
return False # pragma: no cover
|
return False # pragma: no cover
|
||||||
|
|
@ -162,6 +166,8 @@ class Dependant:
|
||||||
_unwrapped_call(self.call)
|
_unwrapped_call(self.call)
|
||||||
):
|
):
|
||||||
return True
|
return True
|
||||||
|
if inspect.isclass(_unwrapped_call(self.call)):
|
||||||
|
return False
|
||||||
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
|
||||||
if dunder_call is None:
|
if dunder_call is None:
|
||||||
return False # pragma: no cover
|
return False # pragma: no cover
|
||||||
|
|
@ -176,7 +182,6 @@ class Dependant:
|
||||||
_impartial(dunder_unwrapped_call)
|
_impartial(dunder_unwrapped_call)
|
||||||
) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):
|
) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):
|
||||||
return True
|
return True
|
||||||
# if inspect.isclass(self.call): False, covered by default return
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,34 @@ async_callable_gen_dependency = AsyncCallableGenDependency()
|
||||||
methods_dependency = MethodsDependency()
|
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")
|
@app.get("/callable-dependency")
|
||||||
async def get_callable_dependency(value: str = Depends(callable_dependency)):
|
async def get_callable_dependency(value: str = Depends(callable_dependency)):
|
||||||
return value
|
return value
|
||||||
|
|
@ -114,6 +142,10 @@ client = TestClient(app)
|
||||||
("/synchronous-method-gen-dependency", "synchronous-method-gen-dependency"),
|
("/synchronous-method-gen-dependency", "synchronous-method-gen-dependency"),
|
||||||
("/asynchronous-method-dependency", "asynchronous-method-dependency"),
|
("/asynchronous-method-dependency", "asynchronous-method-dependency"),
|
||||||
("/asynchronous-method-gen-dependency", "asynchronous-method-gen-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):
|
def test_class_dependency(route, value):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue