From f2f80b177afbe8e7a0fceb7d0b7319cc72e7e48d Mon Sep 17 00:00:00 2001 From: liangyongxiong Date: Tue, 16 Jun 2020 09:55:16 +0800 Subject: [PATCH] add path_prefix argument for start command --- mindinsight/backend/application.py | 2 +- .../backend/datavisual/static_resource_api.py | 14 ++++----- .../backend/datavisual/task_manager_api.py | 2 +- .../backend/datavisual/train_visual_api.py | 2 +- mindinsight/backend/lineagemgr/lineage_api.py | 2 +- mindinsight/backend/profiler/profile_api.py | 2 +- mindinsight/backend/run.py | 2 +- mindinsight/conf/constants.py | 4 +-- mindinsight/conf/defaults.py | 1 + mindinsight/scripts/start.py | 31 +++++++++++++++++++ mindinsight/ui/src/services/fetcher.js | 2 +- tests/ut/backend/datavisual/conftest.py | 8 ++--- 12 files changed, 50 insertions(+), 22 deletions(-) diff --git a/mindinsight/backend/application.py b/mindinsight/backend/application.py index dc16c5d..cdeeca7 100644 --- a/mindinsight/backend/application.py +++ b/mindinsight/backend/application.py @@ -107,7 +107,7 @@ def before_request(): def create_app(): """Set flask APP config, and start the data manager.""" - static_url_path = "/static" + static_url_path = settings.URL_PATH_PREFIX + "/static" static_folder_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir, 'ui', 'dist', 'static')) app = Flask(__name__, static_url_path=static_url_path, static_folder=static_folder_path) diff --git a/mindinsight/backend/datavisual/static_resource_api.py b/mindinsight/backend/datavisual/static_resource_api.py index a8d3574..38cc62e 100644 --- a/mindinsight/backend/datavisual/static_resource_api.py +++ b/mindinsight/backend/datavisual/static_resource_api.py @@ -20,20 +20,18 @@ from flask import current_app from flask import send_from_directory from flask import Blueprint +from mindinsight.conf import settings -APP_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) -BLUEPRINT = Blueprint("static_resource", __name__) + +BLUEPRINT = Blueprint("static_resource", __name__, url_prefix=settings.URL_PATH_PREFIX) @BLUEPRINT.route("/", methods=["GET"]) def index(): """Interface to return static index.html.""" - return send_from_directory(get_index_resource_dir(), "index.html") - - -def get_index_resource_dir(): - """Interface to return index.html resource directory.""" - return os.path.realpath(os.path.join(APP_PATH, current_app.static_folder, os.pardir)) + app_path = os.path.realpath(os.path.dirname(sys.argv[0])) + index_resource_dir = os.path.realpath(os.path.join(app_path, current_app.static_folder, os.pardir)) + return send_from_directory(index_resource_dir, "index.html") def init_module(app): diff --git a/mindinsight/backend/datavisual/task_manager_api.py b/mindinsight/backend/datavisual/task_manager_api.py index 024b790..c07f231 100644 --- a/mindinsight/backend/datavisual/task_manager_api.py +++ b/mindinsight/backend/datavisual/task_manager_api.py @@ -34,7 +34,7 @@ from mindinsight.datavisual.processors.train_task_manager import TrainTaskManage from mindinsight.datavisual.data_transform.data_manager import DATA_MANAGER -BLUEPRINT = Blueprint("task_manager", __name__, url_prefix=settings.URL_PREFIX) +BLUEPRINT = Blueprint("task_manager", __name__, url_prefix=settings.URL_PATH_PREFIX+settings.API_PREFIX) @BLUEPRINT.route("/datavisual/single-job", methods=["GET"]) diff --git a/mindinsight/backend/datavisual/train_visual_api.py b/mindinsight/backend/datavisual/train_visual_api.py index 91871ae..a868a44 100644 --- a/mindinsight/backend/datavisual/train_visual_api.py +++ b/mindinsight/backend/datavisual/train_visual_api.py @@ -31,7 +31,7 @@ from mindinsight.datavisual.processors.graph_processor import GraphProcessor from mindinsight.datavisual.data_transform.data_manager import DATA_MANAGER -BLUEPRINT = Blueprint("train_visual", __name__, url_prefix=settings.URL_PREFIX) +BLUEPRINT = Blueprint("train_visual", __name__, url_prefix=settings.URL_PATH_PREFIX+settings.API_PREFIX) @BLUEPRINT.route("/datavisual/image/metadata", methods=["GET"]) diff --git a/mindinsight/backend/lineagemgr/lineage_api.py b/mindinsight/backend/lineagemgr/lineage_api.py index 7b4846a..8d8547d 100644 --- a/mindinsight/backend/lineagemgr/lineage_api.py +++ b/mindinsight/backend/lineagemgr/lineage_api.py @@ -25,7 +25,7 @@ from mindinsight.lineagemgr.api.model import general_filter_summary_lineage, gen from mindinsight.utils.exceptions import MindInsightException, ParamValueError from mindinsight.lineagemgr.cache_item_updater import update_lineage_object -BLUEPRINT = Blueprint("lineage", __name__, url_prefix=settings.URL_PREFIX.rstrip("/")) +BLUEPRINT = Blueprint("lineage", __name__, url_prefix=settings.URL_PATH_PREFIX+settings.API_PREFIX) @BLUEPRINT.route("/lineagemgr/lineages", methods=["POST"]) diff --git a/mindinsight/backend/profiler/profile_api.py b/mindinsight/backend/profiler/profile_api.py index 043ce70..733879f 100644 --- a/mindinsight/backend/profiler/profile_api.py +++ b/mindinsight/backend/profiler/profile_api.py @@ -41,7 +41,7 @@ from mindinsight.profiler.common.validator.validate_path import validate_and_nor from mindinsight.profiler.proposer.compose_proposer import ComposeProposal from mindinsight.utils.exceptions import ParamValueError -BLUEPRINT = Blueprint("profile", __name__, url_prefix=settings.URL_PREFIX) +BLUEPRINT = Blueprint("profile", __name__, url_prefix=settings.URL_PATH_PREFIX+settings.API_PREFIX) @BLUEPRINT.route("/profile/ops/search", methods=["POST"]) diff --git a/mindinsight/backend/run.py b/mindinsight/backend/run.py index 627aa5d..23831b7 100644 --- a/mindinsight/backend/run.py +++ b/mindinsight/backend/run.py @@ -252,7 +252,7 @@ def start(): else: state_result = _check_server_start_stat(errorlog_abspath, log_size) # print gunicorn start state to stdout - console.info('Web address: http://%s:%s', settings.HOST, settings.PORT) + console.info('Web address: http://%s:%s%s', settings.HOST, settings.PORT, settings.URL_PATH_PREFIX) for line in state_result["prompt_message"]: console.info(line) diff --git a/mindinsight/conf/constants.py b/mindinsight/conf/constants.py index 66e09a3..5677b73 100644 --- a/mindinsight/conf/constants.py +++ b/mindinsight/conf/constants.py @@ -41,8 +41,8 @@ ENABLE_CORS = False SUPPORT_REQUEST_METHODS = {'POST', 'GET', 'PUT', 'DELETE'} -# url prefix should not end with slash, correct format is /v1/url -URL_PREFIX = '/v1/mindinsight' +# api prefix should not end with slash, correct format is /v1/url +API_PREFIX = '/v1/mindinsight' #################################### # Datavisual default settings. diff --git a/mindinsight/conf/defaults.py b/mindinsight/conf/defaults.py index ec3054b..b554869 100644 --- a/mindinsight/conf/defaults.py +++ b/mindinsight/conf/defaults.py @@ -24,6 +24,7 @@ WORKSPACE = os.path.join(os.environ['HOME'], 'mindinsight') # Web default settings. #################################### PORT = 8080 +URL_PATH_PREFIX = '' #################################### # Datavisual default settings. diff --git a/mindinsight/scripts/start.py b/mindinsight/scripts/start.py index e959d5b..77a847c 100644 --- a/mindinsight/scripts/start.py +++ b/mindinsight/scripts/start.py @@ -16,6 +16,7 @@ import os import sys +import re import argparse from importlib import import_module @@ -118,6 +119,28 @@ class PortAction(argparse.Action): setattr(namespace, self.dest, port) +class UrlPathPrefixAction(argparse.Action): + """Url Path prefix action class definition.""" + + REGEX = r'^(\/[a-zA-Z0-9-\-\.]+)+$' + + def __call__(self, parser, namespace, values, option_string=None): + """ + Inherited __call__ method from argparse.Action. + + Args: + parser (ArgumentParser): Passed-in argument parser. + namespace (Namespace): Namespace object to hold arguments. + values (object): Argument values with type depending on argument definition. + option_string (str): Optional string for specific argument name. Default: None. + """ + prefix = values + if not re.match(self.REGEX, prefix): + parser.error(f'{option_string} value is invalid url path prefix') + + setattr(namespace, self.dest, prefix) + + class Command(BaseCommand): """ Start mindinsight service. @@ -158,6 +181,14 @@ class Command(BaseCommand): Custom port ranging from %s to %s. Default value is %s. """ % (PortAction.MIN_PORT, PortAction.MAX_PORT, settings.PORT)) + parser.add_argument( + '--url-path-prefix', + type=str, + action=UrlPathPrefixAction, + help=""" + Custom path prefix for web page address. Default value is ''. + """) + for hook in HookUtils.instance().hooks(): hook.register_startup_arguments(parser) diff --git a/mindinsight/ui/src/services/fetcher.js b/mindinsight/ui/src/services/fetcher.js index e5569cf..69bdc1c 100644 --- a/mindinsight/ui/src/services/fetcher.js +++ b/mindinsight/ui/src/services/fetcher.js @@ -20,7 +20,7 @@ import axios from 'axios'; import Vue from 'vue'; export {default} from 'axios'; -export const basePath = location.origin; +export const basePath = location.origin + location.pathname; axios.defaults.timeout = 30000; axios.defaults.baseURL = basePath; diff --git a/tests/ut/backend/datavisual/conftest.py b/tests/ut/backend/datavisual/conftest.py index a75c248..974f8c2 100644 --- a/tests/ut/backend/datavisual/conftest.py +++ b/tests/ut/backend/datavisual/conftest.py @@ -21,7 +21,7 @@ import pytest from flask import Response from mindinsight.backend import datavisual -from mindinsight.datavisual import utils +from mindinsight.datavisual.utils import tools @pytest.fixture @@ -31,12 +31,10 @@ def client(): mock_data_manager.start_load_data = Mock() datavisual.DATA_MANAGER = mock_data_manager - packages = ["mindinsight.backend.raw_dataset", - "mindinsight.backend.train_dataset", - "mindinsight.backend.data_visual"] + packages = ["mindinsight.backend.data_visual"] mock_obj = Mock(return_value=packages) - utils.find_app_package = mock_obj + tools.find_app_package = mock_obj from mindinsight.backend.application import APP APP.response_class = Response -- GitLab