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): def compile(self):
"""Compile the app and output it to the pages folder.""" """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. # Create a progress bar.
progress = Progress( progress = Progress(
*Progress.get_default_columns()[:-1], *Progress.get_default_columns()[:-1],

View File

@ -358,3 +358,6 @@ PING_TIMEOUT = 120
# Alembic migrations # Alembic migrations
ALEMBIC_CONFIG = os.environ.get("ALEMBIC_CONFIG", "alembic.ini") 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): if backend and processes.is_process_on_port(backend_port):
backend_port = processes.change_or_terminate_port(backend_port, "backend") backend_port = processes.change_or_terminate_port(backend_port, "backend")
# Get the app module.
console.rule("[bold]Starting Reflex App") 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. # Warn if schema is not up to date.
prerequisites.check_schema_up_to_date() prerequisites.check_schema_up_to_date()
@ -172,10 +174,10 @@ def run(
setup_frontend(Path.cwd()) setup_frontend(Path.cwd())
commands.append((frontend_cmd, Path.cwd(), frontend_port)) commands.append((frontend_cmd, Path.cwd(), frontend_port))
if backend and env == constants.Env.PROD: 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): with processes.run_concurrently_context(*commands):
if env == constants.Env.DEV: if env == constants.Env.DEV:
backend_cmd(app.__name__, backend_host, int(backend_port)) backend_cmd(backend_host, int(backend_port))
@cli.command() @cli.command()
@ -268,6 +270,11 @@ def export(
db_cli = typer.Typer() db_cli = typer.Typer()
def _skip_compile():
"""Skip the compile step."""
os.environ[constants.SKIP_COMPILE_ENV_VAR] = "yes"
@db_cli.command(name="init") @db_cli.command(name="init")
def db_init(): def db_init():
"""Create database schema and migration configuration.""" """Create database schema and migration configuration."""
@ -287,6 +294,7 @@ def db_init():
return return
# Initialize the database. # Initialize the database.
_skip_compile()
prerequisites.get_app() prerequisites.get_app()
model.Model.alembic_init() model.Model.alembic_init()
model.Model.migrate(autogenerate=True) model.Model.migrate(autogenerate=True)
@ -295,6 +303,7 @@ def db_init():
@db_cli.command() @db_cli.command()
def migrate(): def migrate():
"""Create or update database schema from migration scripts.""" """Create or update database schema from migration scripts."""
_skip_compile()
prerequisites.get_app() prerequisites.get_app()
if not prerequisites.check_db_initialized(): if not prerequisites.check_db_initialized():
return return
@ -309,6 +318,7 @@ def makemigrations(
), ),
): ):
"""Create autogenerated alembic migration scripts.""" """Create autogenerated alembic migration scripts."""
_skip_compile()
prerequisites.get_app() prerequisites.get_app()
if not prerequisites.check_db_initialized(): if not prerequisites.check_db_initialized():
return return

View File

@ -87,7 +87,6 @@ def run_frontend_prod(
def run_backend( def run_backend(
app_name: str,
host: str, host: str,
port: int, port: int,
loglevel: constants.LogLevel = constants.LogLevel.ERROR, loglevel: constants.LogLevel = constants.LogLevel.ERROR,
@ -96,22 +95,22 @@ def run_backend(
Args: Args:
host: The app host host: The app host
app_name: The app name.
port: The app port port: The app port
loglevel: The log level. loglevel: The log level.
""" """
config = get_config()
app_module = f"{config.app_name}.{config.app_name}:{constants.APP_VAR}"
uvicorn.run( uvicorn.run(
app=f"{app_name}:{constants.APP_VAR}.{constants.API_VAR}", app=f"{app_module}.{constants.API_VAR}",
host=host, host=host,
port=port, port=port,
log_level=loglevel.value, log_level=loglevel.value,
reload=True, reload=True,
reload_dirs=[app_name.split(".")[0]], reload_dirs=[config.app_name],
) )
def run_backend_prod( def run_backend_prod(
app_name: str,
host: str, host: str,
port: int, port: int,
loglevel: constants.LogLevel = constants.LogLevel.ERROR, loglevel: constants.LogLevel = constants.LogLevel.ERROR,
@ -120,7 +119,6 @@ def run_backend_prod(
Args: Args:
host: The app host host: The app host
app_name: The app name.
port: The app port port: The app port
loglevel: The log level. loglevel: The log level.
""" """
@ -128,6 +126,7 @@ def run_backend_prod(
config = get_config() config = get_config()
RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout {config.timeout} --log-level critical".split() 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() 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 = ( command = (
[ [
*RUN_BACKEND_PROD_WINDOWS, *RUN_BACKEND_PROD_WINDOWS,
@ -135,7 +134,7 @@ def run_backend_prod(
host, host,
"--port", "--port",
str(port), str(port),
f"{app_name}:{constants.APP_VAR}", app_module,
] ]
if constants.IS_WINDOWS if constants.IS_WINDOWS
else [ else [
@ -144,7 +143,7 @@ def run_backend_prod(
f"{host}:{port}", f"{host}:{port}",
"--threads", "--threads",
str(num_workers), str(num_workers),
f"{app_name}:{constants.APP_VAR}()", f"{app_module}()",
] ]
) )
@ -154,7 +153,12 @@ def run_backend_prod(
"--workers", "--workers",
str(num_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(): def output_system_info():