From 535389d63eb393b533f52bb92aac988bce85f3de Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 26 Sep 2024 17:43:57 -0700 Subject: [PATCH] Add option expose static folder --- mesop/server/server.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/mesop/server/server.py b/mesop/server/server.py index 7cfdbbcf..55bba3b3 100644 --- a/mesop/server/server.py +++ b/mesop/server/server.py @@ -3,6 +3,7 @@ import json import os import secrets +import sys import time import urllib.parse as urlparse from typing import Any, Generator, Sequence @@ -40,6 +41,7 @@ if EXPERIMENTAL_EDITOR_TOOLBAR_ENABLED: print("Experiment enabled: EXPERIMENTAL_EDITOR_TOOLBAR_ENABLED") + LOCALHOSTS = ( # For IPv4 localhost "127.0.0.1", @@ -49,6 +51,8 @@ STREAM_END = "data: \n\n" +DEFAULT_ASSETS_URL_PATH = "/assets" + def is_processing_request(): return _requests_in_flight > 0 @@ -60,7 +64,15 @@ def is_processing_request(): def configure_flask_app( *, prod_mode: bool = True, exceptions_to_propagate: Sequence[type] = () ) -> Flask: - flask_app = Flask(__name__) + static_assets_folder = get_static_assets_folder() + if static_assets_folder: + flask_app = Flask( + __name__, + static_folder=static_assets_folder, + static_url_path=DEFAULT_ASSETS_URL_PATH, + ) + else: + flask_app = Flask(__name__) def render_loop( path: str, @@ -513,3 +525,16 @@ def sse_request( if decoded_line.startswith(SSE_DATA_PREFIX): event_data = json.loads(decoded_line[len(SSE_DATA_PREFIX) :]) yield event_data + + +def get_static_assets_folder() -> str | None: + folder = os.environ.get("MESOP_STATIC_ASSETS_FOLDER", "") + if not folder: + return None + + if not os.path.isabs(folder): + folder = os.path.join( + os.path.dirname(os.path.abspath(sys.argv[0])), + folder, + ) + return folder