1
0
Эх сурвалжийг харах

Avoid compile step when running production backend (#1665)

Masen Furer 1 жил өмнө
parent
commit
3916668461

+ 2 - 0
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],

+ 3 - 0
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"

+ 14 - 4
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

+ 13 - 9
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():