diff --git a/examples/petstore.py b/examples/petstore.py index 91ac7f4..de81237 100644 --- a/examples/petstore.py +++ b/examples/petstore.py @@ -74,7 +74,7 @@ def get_pet(pet_id): docs.register(get_pet) -class MethodResourceMeta(ResourceMeta, flask.views.MethodViewType): +class MethodResourceMeta(ResourceMeta, flask.views.MethodView): pass class MethodResource(six.with_metaclass(MethodResourceMeta, flask.views.MethodView)): diff --git a/flask_apispec/extension.py b/flask_apispec/extension.py index 68636b1..4b4dd6e 100644 --- a/flask_apispec/extension.py +++ b/flask_apispec/extension.py @@ -44,6 +44,7 @@ def __init__(self, app=None): self.view_converter = None self.resource_converter = None self.spec = None + self.blueprint = None if app: self.init_app(app) @@ -54,6 +55,7 @@ def init_app(self, app): make_apispec(self.app.config.get('APISPEC_TITLE', 'flask-apispec'), self.app.config.get('APISPEC_VERSION', 'v1'), self.app.config.get('APISPEC_OAS_VERSION', '2.0')) + self.blueprint = self.app.config.get('APISPEC_BLUEPRINT') or make_blueprint() self.add_swagger_routes() self.resource_converter = ResourceConverter(self.app, spec=self.spec) self.view_converter = ViewConverter(app=self.app, spec=self.spec) @@ -68,23 +70,15 @@ def _defer(self, callable, *args, **kwargs): bound() def add_swagger_routes(self): - blueprint = flask.Blueprint( - 'flask-apispec', - __name__, - static_folder='./static', - template_folder='./templates', - static_url_path='/flask-apispec/static', - ) - json_url = self.app.config.get('APISPEC_SWAGGER_URL', '/swagger/') if json_url: - blueprint.add_url_rule(json_url, 'swagger-json', self.swagger_json) + self.blueprint.add_url_rule(json_url, 'swagger-json', self.swagger_json) ui_url = self.app.config.get('APISPEC_SWAGGER_UI_URL', '/swagger-ui/') if ui_url: - blueprint.add_url_rule(ui_url, 'swagger-ui', self.swagger_ui) + self.blueprint.add_url_rule(ui_url, 'swagger-ui', self.swagger_ui) - self.app.register_blueprint(blueprint) + self.app.register_blueprint(self.blueprint) def swagger_json(self): return flask.jsonify(self.spec.to_dict()) @@ -148,6 +142,17 @@ def _register(self, target, endpoint=None, blueprint=None, self.spec.path(**path) +def make_blueprint(name='flask-apispec', static_folder='./static', template_folder='./templates', + static_url_path='/flask-apispec/static'): + return flask.Blueprint( + name, + __name__, + static_folder=static_folder, + template_folder=template_folder, + static_url_path=static_url_path, + ) + + def make_apispec(title='flask-apispec', version='v1', openapi_version='2.0'): return APISpec( title=title, diff --git a/flask_apispec/views.py b/flask_apispec/views.py index 06b4fd8..cf3ad16 100644 --- a/flask_apispec/views.py +++ b/flask_apispec/views.py @@ -38,7 +38,7 @@ def __new__(mcs, name, bases, attrs): value.__apispec__['ismethod'] = True return klass -class MethodResourceMeta(ResourceMeta, flask.views.MethodViewType): +class MethodResourceMeta(ResourceMeta, flask.views.MethodView): pass class MethodResource(six.with_metaclass(MethodResourceMeta, flask.views.MethodView)): diff --git a/tests/test_extension.py b/tests/test_extension.py index f1f5a7a..98f071c 100644 --- a/tests/test_extension.py +++ b/tests/test_extension.py @@ -98,3 +98,10 @@ def test_apispec_config(self, app): assert docs.spec.title == 'test-extension' assert docs.spec.version == '2.1' assert docs.spec.openapi_version == '2.0' + + def test_apispec_blueprint_config(self, app): + from flask_apispec.extension import make_blueprint + app.config['APISPEC_BLUEPRINT'] = make_blueprint(name='1') + docs = FlaskApiSpec(app) + + assert docs.blueprint.name == '1'