From 391666846164f9dc4316538b55bec17bc646c62a Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Fri, 25 Aug 2023 14:50:03 -0700 Subject: [PATCH] Avoid compile step when running production backend (#1665) --- reflex/app.py | 2 ++ reflex/constants.py | 3 +++ reflex/reflex.py | 18 ++++++++++++++---- reflex/utils/exec.py | 22 +++++++++++++--------- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/reflex/app.py b/reflex/app.py index 1f0c13260..80eb0fb1e 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -461,6 +461,8 @@ class App(Base): def compile(self): """Compile the app and output it to the pages folder.""" + if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes": + return # Create a progress bar. progress = Progress( *Progress.get_default_columns()[:-1], diff --git a/reflex/constants.py b/reflex/constants.py index 2e283e31e..d235ed653 100644 --- a/reflex/constants.py +++ b/reflex/constants.py @@ -358,3 +358,6 @@ PING_TIMEOUT = 120 # Alembic migrations ALEMBIC_CONFIG = os.environ.get("ALEMBIC_CONFIG", "alembic.ini") + +# If this env var is set to "yes", App.compile will be a no-op +SKIP_COMPILE_ENV_VAR = "__REFLEX_SKIP_COMPILE" diff --git a/reflex/reflex.py b/reflex/reflex.py index b76a7527b..4140f764a 100644 --- a/reflex/reflex.py +++ b/reflex/reflex.py @@ -137,9 +137,11 @@ def run( if backend and processes.is_process_on_port(backend_port): backend_port = processes.change_or_terminate_port(backend_port, "backend") - # Get the app module. console.rule("[bold]Starting Reflex App") - app = prerequisites.get_app() + + if frontend: + # Get the app module. + prerequisites.get_app() # Warn if schema is not up to date. prerequisites.check_schema_up_to_date() @@ -172,10 +174,10 @@ def run( setup_frontend(Path.cwd()) commands.append((frontend_cmd, Path.cwd(), frontend_port)) if backend and env == constants.Env.PROD: - commands.append((backend_cmd, app.__name__, backend_host, backend_port)) + commands.append((backend_cmd, backend_host, backend_port)) with processes.run_concurrently_context(*commands): if env == constants.Env.DEV: - backend_cmd(app.__name__, backend_host, int(backend_port)) + backend_cmd(backend_host, int(backend_port)) @cli.command() @@ -268,6 +270,11 @@ def export( db_cli = typer.Typer() +def _skip_compile(): + """Skip the compile step.""" + os.environ[constants.SKIP_COMPILE_ENV_VAR] = "yes" + + @db_cli.command(name="init") def db_init(): """Create database schema and migration configuration.""" @@ -287,6 +294,7 @@ def db_init(): return # Initialize the database. + _skip_compile() prerequisites.get_app() model.Model.alembic_init() model.Model.migrate(autogenerate=True) @@ -295,6 +303,7 @@ def db_init(): @db_cli.command() def migrate(): """Create or update database schema from migration scripts.""" + _skip_compile() prerequisites.get_app() if not prerequisites.check_db_initialized(): return @@ -309,6 +318,7 @@ def makemigrations( ), ): """Create autogenerated alembic migration scripts.""" + _skip_compile() prerequisites.get_app() if not prerequisites.check_db_initialized(): return diff --git a/reflex/utils/exec.py b/reflex/utils/exec.py index 97ef040a8..abebc1d05 100644 --- a/reflex/utils/exec.py +++ b/reflex/utils/exec.py @@ -87,7 +87,6 @@ def run_frontend_prod( def run_backend( - app_name: str, host: str, port: int, loglevel: constants.LogLevel = constants.LogLevel.ERROR, @@ -96,22 +95,22 @@ def run_backend( Args: host: The app host - app_name: The app name. port: The app port loglevel: The log level. """ + config = get_config() + app_module = f"{config.app_name}.{config.app_name}:{constants.APP_VAR}" uvicorn.run( - app=f"{app_name}:{constants.APP_VAR}.{constants.API_VAR}", + app=f"{app_module}.{constants.API_VAR}", host=host, port=port, log_level=loglevel.value, reload=True, - reload_dirs=[app_name.split(".")[0]], + reload_dirs=[config.app_name], ) def run_backend_prod( - app_name: str, host: str, port: int, loglevel: constants.LogLevel = constants.LogLevel.ERROR, @@ -120,7 +119,6 @@ def run_backend_prod( Args: host: The app host - app_name: The app name. port: The app port loglevel: The log level. """ @@ -128,6 +126,7 @@ def run_backend_prod( config = get_config() RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout {config.timeout} --log-level critical".split() RUN_BACKEND_PROD_WINDOWS = f"uvicorn --timeout-keep-alive {config.timeout}".split() + app_module = f"{config.app_name}.{config.app_name}:{constants.APP_VAR}" command = ( [ *RUN_BACKEND_PROD_WINDOWS, @@ -135,7 +134,7 @@ def run_backend_prod( host, "--port", str(port), - f"{app_name}:{constants.APP_VAR}", + app_module, ] if constants.IS_WINDOWS else [ @@ -144,7 +143,7 @@ def run_backend_prod( f"{host}:{port}", "--threads", str(num_workers), - f"{app_name}:{constants.APP_VAR}()", + f"{app_module}()", ] ) @@ -154,7 +153,12 @@ def run_backend_prod( "--workers", str(num_workers), ] - processes.new_process(command, run=True, show_logs=True) + processes.new_process( + command, + run=True, + show_logs=True, + env={constants.SKIP_COMPILE_ENV_VAR: "yes"}, # skip compile for prod backend + ) def output_system_info():