From 72ec66506baf306bb883019253eb489a0250f1ff Mon Sep 17 00:00:00 2001 From: MrRen <59640496+kanhebei@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:07:17 +0800 Subject: [PATCH 1/2] Update __init__.py --- src/flask_smorest/__init__.py | 49 ++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/flask_smorest/__init__.py b/src/flask_smorest/__init__.py index 7bcbdd6a..d5538df9 100644 --- a/src/flask_smorest/__init__.py +++ b/src/flask_smorest/__init__.py @@ -1,5 +1,7 @@ """Api extension initialization""" +from typing import Union +from werkzeug.utils import import_string from webargs.flaskparser import abort # noqa from .spec import APISpecMixin @@ -41,6 +43,7 @@ class Api(APISpecMixin, ErrorHandlerMixin): """ def __init__(self, app=None, *, spec_kwargs=None, config_prefix=""): + self._routes = [] self._app = app self._spec_kwargs = spec_kwargs or {} self.config_prefix = normalize_config_prefix(config_prefix) @@ -83,7 +86,11 @@ def init_app(self, app, *, spec_kwargs=None): # Register error handlers self._register_error_handlers() - def register_blueprint(self, blp, *, parameters=None, **options): + for blp, parameters, options in self._routes: + self.register_blueprint(blp, parameters=parameters, **options) + + + def register_blueprint(self, blp: Union[Blueprint, str], *, parameters=None, **options): """Register a blueprint in the application Also registers documentation for the blueprint/resource @@ -96,20 +103,26 @@ def register_blueprint(self, blp, *, parameters=None, **options): Must be called after app is initialized. """ - blp_name = options.get("name", blp.name) - - self._app.extensions["flask-smorest"]["blp_name_to_api"][blp_name] = self - - self._app.register_blueprint(blp, **options) - - # Register views in API documentation for this resource - blp.register_views_in_doc( - self, - self._app, - self.spec, - name=blp_name, - parameters=parameters, - ) - - # Add tag relative to this resource to the global tag list - self.spec.tag({"name": blp_name, "description": blp.description}) + if isinstance(blp, str): + blp = import_string(blp) + + if self._app: + blp_name = options.get("name", blp.name) + + self._app.extensions["flask-smorest"]["blp_name_to_api"][blp_name] = self + + self._app.register_blueprint(blp, **options) + + # Register views in API documentation for this resource + blp.register_views_in_doc( + self, + self._app, + self.spec, + name=blp_name, + parameters=parameters, + ) + + # Add tag relative to this resource to the global tag list + self.spec.tag({"name": blp_name, "description": blp.description}) + else: + self._routes.append((blp, parameters, options)) From da8b518016579b60099166e50ff85ff367652454 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 14:19:07 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/flask_smorest/__init__.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/flask_smorest/__init__.py b/src/flask_smorest/__init__.py index d5538df9..00431b50 100644 --- a/src/flask_smorest/__init__.py +++ b/src/flask_smorest/__init__.py @@ -1,14 +1,16 @@ """Api extension initialization""" from typing import Union + from werkzeug.utils import import_string + from webargs.flaskparser import abort # noqa -from .spec import APISpecMixin from .blueprint import Blueprint # noqa -from .pagination import Page # noqa from .error_handler import ErrorHandlerMixin from .globals import current_api # noqa +from .pagination import Page # noqa +from .spec import APISpecMixin from .utils import PrefixedMappingProxy, normalize_config_prefix @@ -88,9 +90,10 @@ def init_app(self, app, *, spec_kwargs=None): for blp, parameters, options in self._routes: self.register_blueprint(blp, parameters=parameters, **options) - - def register_blueprint(self, blp: Union[Blueprint, str], *, parameters=None, **options): + def register_blueprint( + self, blp: Union[Blueprint, str], *, parameters=None, **options + ): """Register a blueprint in the application Also registers documentation for the blueprint/resource @@ -106,13 +109,13 @@ def register_blueprint(self, blp: Union[Blueprint, str], *, parameters=None, **o if isinstance(blp, str): blp = import_string(blp) - if self._app: + if self._app: blp_name = options.get("name", blp.name) - + self._app.extensions["flask-smorest"]["blp_name_to_api"][blp_name] = self - + self._app.register_blueprint(blp, **options) - + # Register views in API documentation for this resource blp.register_views_in_doc( self, @@ -121,7 +124,7 @@ def register_blueprint(self, blp: Union[Blueprint, str], *, parameters=None, **o name=blp_name, parameters=parameters, ) - + # Add tag relative to this resource to the global tag list self.spec.tag({"name": blp_name, "description": blp.description}) else: