From 80ab6155bbb31eaf9f311f4b3e37400e38aea24b Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Sat, 28 Sep 2024 22:48:39 +0700 Subject: [PATCH 1/6] add sso hooks --- taipy/gui/_default_config.py | 2 +- taipy/gui/gui.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/taipy/gui/_default_config.py b/taipy/gui/_default_config.py index 4cc540ea4..eb80a4145 100644 --- a/taipy/gui/_default_config.py +++ b/taipy/gui/_default_config.py @@ -46,7 +46,7 @@ "change_delay": None, "chart_dark_template": None, "base_url": "/", - "client_url": "http://localhost:5000", + "client_url": "http://127.0.0.1:5000", "dark_mode": True, "dark_theme": None, "debug": False, diff --git a/taipy/gui/gui.py b/taipy/gui/gui.py index 43f755629..1b94d69bf 100644 --- a/taipy/gui/gui.py +++ b/taipy/gui/gui.py @@ -2609,6 +2609,8 @@ def __register_blueprint(self): # server URL Rule for flask rendered react-router pages_bp.add_url_rule(f"/{Gui.__INIT_URL}", view_func=self.__init_route) + _Hooks()._add_external_blueprint(self, __name__) + # Register Flask Blueprint if available for bp in self._flask_blueprint: t.cast(Flask, self._server.get_flask()).register_blueprint(bp) From f34e5d7fcafab688b29105fe2387ae9b42ff129c Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Mon, 30 Sep 2024 14:52:54 +0700 Subject: [PATCH 2/6] add dynamic client port --- taipy/gui/_default_config.py | 2 +- taipy/gui/gui.py | 4 ++++ taipy/gui/server.py | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/taipy/gui/_default_config.py b/taipy/gui/_default_config.py index eb80a4145..7cbc6f20a 100644 --- a/taipy/gui/_default_config.py +++ b/taipy/gui/_default_config.py @@ -46,7 +46,7 @@ "change_delay": None, "chart_dark_template": None, "base_url": "/", - "client_url": "http://127.0.0.1:5000", + "client_url": "http://localhost:{port}", "dark_mode": True, "dark_theme": None, "debug": False, diff --git a/taipy/gui/gui.py b/taipy/gui/gui.py index 1b94d69bf..623b665fe 100644 --- a/taipy/gui/gui.py +++ b/taipy/gui/gui.py @@ -2412,6 +2412,9 @@ def get_flask_app(self) -> Flask: return t.cast(Flask, self._server.get_flask()) raise RuntimeError("get_flask_app() cannot be invoked before run() has been called.") + def _get_port(self) -> int: + return self._server.get_port() + def _set_frame(self, frame: t.Optional[FrameType]): if not isinstance(frame, FrameType): # pragma: no cover raise RuntimeError("frame must be a FrameType where Gui can collect the local variables.") @@ -2777,6 +2780,7 @@ def run( return self._server.run( host=app_config.get("host"), port=app_config.get("port"), + client_url=app_config.get("client_url"), debug=app_config.get("debug"), use_reloader=app_config.get("use_reloader"), flask_log=app_config.get("flask_log"), diff --git a/taipy/gui/server.py b/taipy/gui/server.py index dfada6091..c4d823b66 100644 --- a/taipy/gui/server.py +++ b/taipy/gui/server.py @@ -246,6 +246,9 @@ def _direct_render_json(self, data): def get_flask(self): return self._flask + def get_port(self): + return self._port + def test_client(self): return t.cast(Flask, self._flask).test_client() @@ -286,6 +289,7 @@ def run( self, host, port, + client_url, debug, use_reloader, flask_log, @@ -299,6 +303,7 @@ def run( if port == "auto": port = self._get_random_port(port_auto_ranges) self._port = port + client_url = client_url.format(port=port) if _is_in_notebook() and notebook_proxy: # pragma: no cover from .utils.proxy import NotebookProxy @@ -320,6 +325,7 @@ def run( _TaipyLogger._get_logger().info(f" * Server starting on http://{host_value}:{port}") else: _TaipyLogger._get_logger().info(f" * Server reloaded on http://{host_value}:{port}") + _TaipyLogger._get_logger().info(f" * Application is accessible at {client_url}") if not is_running_from_reloader() and self._gui._get_config("run_browser", False): webbrowser.open(f"http://{host_value}{f':{port}' if port else ''}", new=2) if _is_in_notebook() or run_in_thread: From 47e421511dde715d0a34f39a059e3ba1bdbb8548 Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Mon, 30 Sep 2024 14:54:12 +0700 Subject: [PATCH 3/6] webbrowser now open the client_url --- taipy/gui/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taipy/gui/server.py b/taipy/gui/server.py index c4d823b66..700dac194 100644 --- a/taipy/gui/server.py +++ b/taipy/gui/server.py @@ -327,7 +327,7 @@ def run( _TaipyLogger._get_logger().info(f" * Server reloaded on http://{host_value}:{port}") _TaipyLogger._get_logger().info(f" * Application is accessible at {client_url}") if not is_running_from_reloader() and self._gui._get_config("run_browser", False): - webbrowser.open(f"http://{host_value}{f':{port}' if port else ''}", new=2) + webbrowser.open(client_url, new=2) if _is_in_notebook() or run_in_thread: self._thread = KThread(target=self._run_notebook) self._thread.start() From 721b5ec88e8772cbc3aea3940b7c2e8abcced2ee Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Mon, 30 Sep 2024 15:08:11 +0700 Subject: [PATCH 4/6] fix tests --- tests/gui/helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/gui/helpers.py b/tests/gui/helpers.py index 96ec5be70..634fb6cfd 100644 --- a/tests/gui/helpers.py +++ b/tests/gui/helpers.py @@ -151,6 +151,7 @@ def run_e2e_multi_client(gui: Gui): gui._server.run( host=gui._get_config("host", "127.0.0.1"), port=gui._get_config("port", 5000), + client_url=gui._get_config("client_url", "http://localhost:{port}"), debug=False, use_reloader=False, flask_log=False, From d14b661be7f5ca6f09604b276e8ba0dfa55fc068 Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Mon, 30 Sep 2024 15:15:26 +0700 Subject: [PATCH 5/6] add --client-url cli param --- taipy/gui/_gui_cli.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/taipy/gui/_gui_cli.py b/taipy/gui/_gui_cli.py index 3a23e5bda..011f97e54 100644 --- a/taipy/gui/_gui_cli.py +++ b/taipy/gui/_gui_cli.py @@ -35,6 +35,14 @@ class _GuiCLI(_AbstractCLI): "const": "", "help": "Specify server host", }, + ("--client-url", "-H"): { + "dest": "taipy_client_url", + "metavar": "CLIENT_URL", + "nargs": "?", + "default": "", + "const": "", + "help": "Specify client url", + }, ("--ngrok-token",): { "dest": "taipy_ngrok_token", "metavar": "NGROK_TOKEN", From fd0b97c78688a571e96ca5814d951a31321eb1a1 Mon Sep 17 00:00:00 2001 From: dinhlongviolin1 Date: Mon, 30 Sep 2024 15:22:38 +0700 Subject: [PATCH 6/6] handle taipy-client-url args --- taipy/gui/config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/taipy/gui/config.py b/taipy/gui/config.py index 810b650b7..d30c6c30a 100644 --- a/taipy/gui/config.py +++ b/taipy/gui/config.py @@ -223,6 +223,8 @@ def _handle_argparse(self): config["upload_folder"] = args.taipy_upload_folder elif os.environ.get("TAIPY_GUI_UPLOAD_FOLDER"): config["webapp_path"] = os.environ.get("TAIPY_GUI_UPLOAD_FOLDER") + if args.taipy_client_url: + config["client_url"] = args.taipy_client_url def _build_config(self, root_dir, env_filename, kwargs): # pragma: no cover config = self.config