Avoid compile step when running production backend (#1665)

This commit is contained in:
Masen Furer 2023-08-25 14:50:03 -07:00 committed by GitHub
parent b02afc326e
commit 3916668461
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 13 deletions

View File

@ -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],

View File

@ -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"

View File

@ -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

View File

@ -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():