From a0a3840094f768a47064f43c5ed2acc5b02602bb Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Wed, 15 Dec 2021 01:07:42 +0200 Subject: [PATCH] Add pre-registry --- sanic/app.py | 9 ++++++++- sanic/blueprints.py | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/sanic/app.py b/sanic/app.py index 6a287471..b070a1e9 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -50,7 +50,7 @@ from sanic_routing.exceptions import ( # type: ignore ) from sanic_routing.route import Route # type: ignore -from sanic import reloader_helpers +from sanic import blueprint_group, reloader_helpers from sanic.application.logo import get_logo from sanic.application.motd import MOTD from sanic.application.state import ApplicationState, Mode @@ -536,6 +536,12 @@ class Sanic(BaseSanic, metaclass=TouchUpMeta): blueprint.strict_slashes = self.strict_slashes blueprint.register(self, options) + def _register_lazy_blueprints(self): + for name, reg_info in Blueprint.__pre_registry__.items(): + blueprint = reg_info.pop("bp") + if name == self.name and blueprint.name not in self.blueprints: + self.blueprint(blueprint, **reg_info) + def url_for(self, view_name: str, **kwargs): """Build a URL based on a view name and the values provided. @@ -1697,6 +1703,7 @@ class Sanic(BaseSanic, metaclass=TouchUpMeta): async def _startup(self): self._future_registry.clear() + self._register_lazy_blueprints() self.signalize() self.finalize() ErrorHandler.finalize( diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 6a6c2e82..d4e34724 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -107,6 +107,7 @@ class Blueprint(BaseSanic): "version_prefix", "websocket_routes", ) + __pre_registry__: Dict[str, Any] = {} def __init__( self, @@ -461,3 +462,25 @@ class Blueprint(BaseSanic): ): for app in apps: app._future_registry.update(set((bp, item) for item in futures)) + + def pre_register( + self, + name: str = None, + url_prefix: Optional[str] = None, + host: Optional[Union[List[str], str]] = None, + version: Optional[Union[int, str, float]] = None, + strict_slashes: Optional[bool] = None, + version_prefix: Union[str, Default] = _default, + ) -> None: + self.__class__.__pre_registry__[name] = { + k: v + for k, v in { + "bp": self, + "url_prefix": url_prefix, + "host": host, + "version": version, + "strict_slashes": strict_slashes, + "version_prefix": version_prefix, + }.items() + if v is not None and v is not _default + }