From 50220ec7382271bbafbf0fee250746be35bb622b Mon Sep 17 00:00:00 2001 From: Zhiwei Liang Date: Sun, 19 Mar 2023 02:33:15 -0400 Subject: [PATCH] Adding allow route overwrite option --- sanic/app.py | 5 ++++- sanic/blueprints.py | 13 +++++++++++-- sanic/router.py | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 1adc2732..51f7db19 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -415,8 +415,11 @@ class Sanic(StaticHandleMixin, BaseSanic, StartupMixin, metaclass=TouchUpMeta): def _apply_listener(self, listener: FutureListener): return self.register_listener(listener.listener, listener.event) - def _apply_route(self, route: FutureRoute) -> List[Route]: + def _apply_route( + self, route: FutureRoute, overwrite: bool = False + ) -> List[Route]: params = route._asdict() + params["overwrite"] = overwrite websocket = params.pop("websocket", False) subprotocols = params.pop("subprotocols", None) diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 8050e1f6..f636f396 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -93,6 +93,7 @@ class Blueprint(BaseSanic): "_future_listeners", "_future_exceptions", "_future_signals", + "allow_route_overwrite", "ctx", "exceptions", "host", @@ -115,9 +116,11 @@ class Blueprint(BaseSanic): version: Optional[Union[int, str, float]] = None, strict_slashes: Optional[bool] = None, version_prefix: str = "/v", + allow_route_overwrite: bool = False, ): super().__init__(name=name) self.reset() + self.allow_route_overwrite = allow_route_overwrite self.ctx = SimpleNamespace() self.host = host self.strict_slashes = strict_slashes @@ -167,6 +170,7 @@ class Blueprint(BaseSanic): def reset(self): self._apps: Set[Sanic] = set() + self.allow_route_overwrite = False self.exceptions: List[RouteHandler] = [] self.listeners: Dict[str, List[ListenerType[Any]]] = {} self.middlewares: List[MiddlewareType] = [] @@ -180,6 +184,7 @@ class Blueprint(BaseSanic): url_prefix: Optional[Union[str, Default]] = _default, version: Optional[Union[int, str, float, Default]] = _default, version_prefix: Union[str, Default] = _default, + allow_route_overwrite: bool = _default, strict_slashes: Optional[Union[bool, Default]] = _default, with_registration: bool = True, with_ctx: bool = False, @@ -222,6 +227,8 @@ class Blueprint(BaseSanic): new_bp.strict_slashes = strict_slashes if not isinstance(version_prefix, Default): new_bp.version_prefix = version_prefix + if not isinstance(allow_route_overwrite, Default): + new_bp.allow_route_overwrite = allow_route_overwrite for key, value in attrs_backup.items(): setattr(self, key, value) @@ -277,7 +284,7 @@ class Blueprint(BaseSanic): bps.append(bp) return bps - def register(self, app, options): + def register(self, app: Sanic, options: Dict[str, Any]): """ Register the blueprint to the sanic app. @@ -351,7 +358,9 @@ class Blueprint(BaseSanic): continue registered.add(apply_route) - route = app._apply_route(apply_route) + route = app._apply_route( + apply_route, overwrite=self.allow_route_overwrite + ) operation = ( routes.extend if isinstance(route, list) else routes.append ) diff --git a/sanic/router.py b/sanic/router.py index 26d5eff6..19c5bccb 100644 --- a/sanic/router.py +++ b/sanic/router.py @@ -78,6 +78,7 @@ class Router(BaseRouter): unquote: bool = False, static: bool = False, version_prefix: str = "/v", + overwrite: bool = False, error_format: Optional[str] = None, ) -> Union[Route, List[Route]]: """ @@ -120,6 +121,7 @@ class Router(BaseRouter): name=name, strict=strict_slashes, unquote=unquote, + overwrite=overwrite, ) if isinstance(host, str):