[FEATURE] Option to infer response_model
See original GitHub issueIs your feature request related to a problem? Please describe.
Primarily for the sake of the generated OpenAPI spec (but also for security/validation reasons), I currently specify a response_model
for nearly all of my endpoints, but for the vast majority of my endpoints, the response_model
is the same as the type that the endpoint returns.
This means that I am frequently duplicating the response_model
in the return annotation.
In order to reduce duplication/room for copying/refactoring mistakes, it would be great if it were possible to (optionally) infer the response_model
from the endpoint signature.
It should still be possible to override the value, and it should be ignored if a raw Response
class is returned, I would just want the default to be the annotated return type of the endpoint. Note: this implementation would also make it much easier to catch anywhere the response_model
differed from the returned value’s type while scanning through code.
To be clear, I don’t think this needs to be the default behavior, I just would like the option to enable it.
I am currently using the following subclass of APIRouter
in my code to enable this:
from typing import TYPE_CHECKING, Any, Callable, get_type_hints
from fastapi import APIRouter
class InferringRouter(APIRouter):
if not TYPE_CHECKING:
def add_api_route(self, path: str, endpoint: Callable[..., Any], **kwargs: Any) -> None:
if kwargs.get("response_model") is None:
kwargs["response_model"] = get_type_hints(endpoint).get("return")
return super().add_api_route(path, endpoint, **kwargs)
else: # pragma: no cover
pass
I think it would be nice if this capability was upstreamed though, both to ensure it is maintained, but also so others can benefit.
Describe the solution you’d like
Rather than using the above implementation (which has some problems – for example, it isn’t possible to specify None
as the response_model
with an annotated return type), I think it would be better if there were a boolean-valued keyword argument to the APIRouter
initializer that, if enabled, would cause the default behavior to be to have the annotated return type used as the response_model
by default.
Issue Analytics
- State:
- Created 4 years ago
- Reactions:18
- Comments:8 (3 by maintainers)
Top GitHub Comments
For anyone following this thread, I’ve released fastapi-utils which includes the
InferringRouter
class above.You can read the docs here: https://fastapi-utils.davidmontague.xyz/user-guide/inferring-router/
I think the API introduced by @dmontagu in
fastapi_utils
makes sense to integrate with FastAPI proper, with the addition of aresponse_model=None
to override the return annotation as @tiangolo suggests.Seems fairly trivial to handle this using a sentinel value.