From 49632ea19f6dc24e0174c2dfa47ffc253261db3d Mon Sep 17 00:00:00 2001 From: Louise Davies Date: Wed, 29 Mar 2023 16:49:57 +0100 Subject: [PATCH] fix!: add url_prefix param to fix swagger docs at non-root paths #408 --- datagateway_api/config.yaml.example | 1 + datagateway_api/src/api_start_utils.py | 8 ++++---- datagateway_api/src/common/config.py | 5 +++++ datagateway_api/src/main.py | 7 +++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/datagateway_api/config.yaml.example b/datagateway_api/config.yaml.example index 5224f796..0634e1ac 100644 --- a/datagateway_api/config.yaml.example +++ b/datagateway_api/config.yaml.example @@ -30,3 +30,4 @@ host: "127.0.0.1" port: "5000" test_user_credentials: { username: "root", password: "pw" } test_mechanism: "simple" +url_prefix: "/" diff --git a/datagateway_api/src/api_start_utils.py b/datagateway_api/src/api_start_utils.py index ced74576..eb5d13b7 100644 --- a/datagateway_api/src/api_start_utils.py +++ b/datagateway_api/src/api_start_utils.py @@ -69,8 +69,8 @@ def handle_error(self, e): def configure_datagateway_api_swaggerui_blueprint(flask_app): swaggerui_blueprint = get_swaggerui_blueprint( - base_url=Config.config.datagateway_api.extension, - api_url="/datagateway-api/openapi.json", + base_url=f"{Config.config.url_prefix}{Config.config.datagateway_api.extension}", + api_url=f"{Config.config.url_prefix}/datagateway-api/openapi.json", config={"app_name": "DataGateway API OpenAPI Spec"}, blueprint_name="DataGateway API Swagger UI", ) @@ -83,8 +83,8 @@ def configure_datagateway_api_swaggerui_blueprint(flask_app): def configure_search_api_swaggerui_blueprint(flask_app): swaggerui_blueprint = get_swaggerui_blueprint( - base_url=Config.config.search_api.extension, - api_url="/search-api/openapi.json", + base_url=f"{Config.config.url_prefix}{Config.config.search_api.extension}", + api_url=f"{Config.config.url_prefix}/search-api/openapi.json", config={"app_name": "Search API OpenAPI Spec"}, blueprint_name="Search API Swagger UI", ) diff --git a/datagateway_api/src/common/config.py b/datagateway_api/src/common/config.py index 9f190bb7..204e96f1 100644 --- a/datagateway_api/src/common/config.py +++ b/datagateway_api/src/common/config.py @@ -32,6 +32,8 @@ def validate_extension(extension): raise ValueError("must start with '/'") if extension.endswith("/") and len(extension) != 1: raise ValueError("must not end with '/'") + if extension == "/": + extension = "" return extension @@ -183,6 +185,9 @@ class APIConfig(BaseModel): search_api: Optional[SearchAPI] test_mechanism: Optional[StrictStr] test_user_credentials: Optional[TestUserCredentials] + url_prefix: StrictStr + + _validate_extension = validator("url_prefix", allow_reuse=True)(validate_extension) @classmethod def load(cls, path=Path(__file__).parent.parent.parent / "config.yaml"): diff --git a/datagateway_api/src/main.py b/datagateway_api/src/main.py index fd2c04dd..3bb1d1b0 100644 --- a/datagateway_api/src/main.py +++ b/datagateway_api/src/main.py @@ -9,6 +9,8 @@ ) from datagateway_api.src.common.config import Config from datagateway_api.src.common.logger_setup import setup_logger +from werkzeug.middleware.dispatcher import DispatcherMiddleware +from werkzeug.wrappers import Response setup_logger() log = logging.getLogger() @@ -18,8 +20,13 @@ api, specs = create_app_infrastructure(app) create_api_endpoints(app, api, specs) create_openapi_endpoints(app, specs) +app.config["APPLICATION_ROOT"] = Config.config.url_prefix if __name__ == "__main__": + app.wsgi_app = DispatcherMiddleware( + Response('Not Found', status=404), + {Config.config.url_prefix: app.wsgi_app} + ) app.run( host=Config.config.host, port=Config.config.port,