Browse Source

feat: validate if route already exists

pull/5595/head
Irfanuddin 2 years ago
parent
commit
e0cddac459
No known key found for this signature in database GPG Key ID: EDDB7CBA28F0477C
  1. 7
      fastapi/exceptions.py
  2. 11
      fastapi/routing.py

7
fastapi/exceptions.py

@ -34,3 +34,10 @@ class RequestValidationError(ValidationError):
class WebSocketRequestValidationError(ValidationError):
def __init__(self, errors: Sequence[ErrorList]) -> None:
super().__init__(errors, WebSocketErrorModel)
class RouteAlreadyExistsError(FastAPIError):
def __init__(self, f_name: str):
self.f_name = f_name
self.message = f"Route defined for {f_name} already exists!"
super().__init__(self.message)

11
fastapi/routing.py

@ -29,7 +29,11 @@ from fastapi.dependencies.utils import (
solve_dependencies,
)
from fastapi.encoders import DictIntStrAny, SetIntStr, jsonable_encoder
from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError
from fastapi.exceptions import (
RequestValidationError,
RouteAlreadyExistsError,
WebSocketRequestValidationError,
)
from fastapi.types import DecoratedCallable
from fastapi.utils import (
create_cloned_field,
@ -442,6 +446,7 @@ class APIRoute(routing.Route):
get_parameterless_sub_dependant(depends=depends, path=self.path_format),
)
self.body_field = get_body_field(dependant=self.dependant, name=self.unique_id)
self.hash_val = f"path:{self.path};methods:{self.methods}"
self.app = request_response(self.get_route_handler())
def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]:
@ -513,6 +518,7 @@ class APIRouter(routing.Router):
self.route_class = route_class
self.default_response_class = default_response_class
self.generate_unique_id_function = generate_unique_id_function
self.added_routes = set()
def add_api_route(
self,
@ -594,6 +600,9 @@ class APIRouter(routing.Router):
openapi_extra=openapi_extra,
generate_unique_id_function=current_generate_unique_id,
)
if route.hash_val in self.added_routes:
raise RouteAlreadyExistsError(route.name)
self.added_routes.add(route.hash_val)
self.routes.append(route)
def api_route(

Loading…
Cancel
Save