Avoid compile step when running production backend (#1665)
This commit is contained in:
parent
b02afc326e
commit
3916668461
@ -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],
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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():
|
||||||
|
Loading…
Reference in New Issue
Block a user