From b21745b098e479ac6b524b1a59bd0e447abdc6d9 Mon Sep 17 00:00:00 2001 From: Julian <julian@edyoucated.org> Date: Tue, 16 Apr 2024 17:37:36 +0200 Subject: [PATCH] include conditional MyApp proxy for dash --- app/my_app.py | 70 ++++++++++++++++++++++++++++++++++++++ dash_proxy/my_app_proxy.py | 16 +++++++++ dash_proxy/setup.py | 3 +- 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 app/my_app.py create mode 100644 dash_proxy/my_app_proxy.py diff --git a/app/my_app.py b/app/my_app.py new file mode 100644 index 0000000..db083be --- /dev/null +++ b/app/my_app.py @@ -0,0 +1,70 @@ +import sys +sys.path.append("/home/jovyan/") + +import argparse +import logging + +from urllib.parse import urlparse, urljoin + +from dash import Dash + +from jupyter_server.serverapp import list_running_servers + +try: + from my_layout import layout + from my_callbacks import register_callbacks +except ModuleNotFoundError: + # do not let Dash start + exit() + + +logging.basicConfig(level=logging.INFO) + +# weird trick to find base_url for the jupyterlab +def find_jupyterlab_base_url(): + servers = list_running_servers() + for server in servers: + if server["port"] == 8888: + return server['url'] + return None + + +# get the correct port from proxy +parser = argparse.ArgumentParser() +parser.add_argument("--port", type=int) +args = parser.parse_args() +port: int = args.port + +if not port: + raise ValueError(f"Port of proxy server for Dash not found in {args}.") +else: + logging.debug(f"Dash app running on port {port}.") + + +base_url = find_jupyterlab_base_url() +if base_url is None: + raise ValueError("Base URL of Jupyterlab could not be detected.") +logging.debug(f"Base URL: {base_url}") + +proxy_base_path = urlparse(urljoin(base_url + "/", f"proxy/{port}/")).path +logging.debug(f"Proxy base path: {proxy_base_path}") + +# define Dash app +app = Dash( + name=__name__, + requests_pathname_prefix=proxy_base_path +) + +# define layout +app.layout = layout + +# register all callback functions +register_callbacks(app=app) + +# Run Dash app in the notebook +app.run( + jupyter_mode="jupyterlab", + port=port, + host="0.0.0.0", + debug=True +) diff --git a/dash_proxy/my_app_proxy.py b/dash_proxy/my_app_proxy.py new file mode 100644 index 0000000..e91a864 --- /dev/null +++ b/dash_proxy/my_app_proxy.py @@ -0,0 +1,16 @@ +def setup_my_app_proxy(): + command = [ + 'python', + '/dash/app/my_app.py', + '--port', + '{port}' + ] + + return { + "command": command, + "new_browser_tab": False, + "launcher_entry": { + "enabled": True, + 'title': 'MyApp' + } + } diff --git a/dash_proxy/setup.py b/dash_proxy/setup.py index ccd874c..8e1ebf5 100644 --- a/dash_proxy/setup.py +++ b/dash_proxy/setup.py @@ -5,11 +5,12 @@ setuptools.setup( author_email="julian.rasch@fh-muenster.de", description="A small module to run Dash inside a dockerized Jupyterlab.", name="jupyter-dash-proxy", - py_modules=["dash_proxy"], + py_modules=["dash_proxy", "my_app_proxy"], entry_points={ "jupyter_serverproxy_servers": [ # name = packagename:function_name "Dash = dash_proxy:setup_dash_proxy", + "MyApp = my_app_proxy:setup_my_app_proxy" ] }, install_requires=["jupyter-server-proxy==4.0.0"], -- GitLab