diff --git a/reflex/app.py b/reflex/app.py index f8300d8ec..f85294884 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -77,7 +77,7 @@ from reflex.state import ( code_uses_state_contexts, ) from reflex.utils import console, exceptions, format, prerequisites, types -from reflex.utils.exec import is_testing_env +from reflex.utils.exec import is_testing_env, should_skip_compile from reflex.utils.imports import ImportVar # Define custom types. @@ -672,7 +672,7 @@ class App(Base): Whether the app should be compiled. """ # Check the environment variable. - if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes": + if should_skip_compile(): return False # Check the nocompile file. diff --git a/reflex/utils/exec.py b/reflex/utils/exec.py index 39326ff7f..44acdf3ee 100644 --- a/reflex/utils/exec.py +++ b/reflex/utils/exec.py @@ -307,3 +307,12 @@ def is_prod_mode() -> bool: constants.Env.DEV.value, ) return current_mode == constants.Env.PROD.value + + +def should_skip_compile() -> bool: + """Whether the app should skip compile. + + Returns: + True if the app should skip compile. + """ + return os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes" diff --git a/reflex/utils/prerequisites.py b/reflex/utils/prerequisites.py index f60359b0b..507d6f0f8 100644 --- a/reflex/utils/prerequisites.py +++ b/reflex/utils/prerequisites.py @@ -448,7 +448,7 @@ def get_project_hash(raise_on_fail: bool = False) -> int | None: # Open and read the file with open(constants.Reflex.JSON, "r") as file: data = json.load(file) - return data["project_hash"] + return data.get("project_hash") def initialize_web_directory(): diff --git a/reflex/utils/telemetry.py b/reflex/utils/telemetry.py index 84080d1ee..7133a6f30 100644 --- a/reflex/utils/telemetry.py +++ b/reflex/utils/telemetry.py @@ -11,6 +11,7 @@ import psutil from reflex import constants from reflex.utils import console +from reflex.utils.exec import should_skip_compile from reflex.utils.prerequisites import ensure_reflex_installation_id, get_project_hash POSTHOG_API_URL: str = "https://app.posthog.com/capture/" @@ -64,6 +65,22 @@ def get_memory() -> int: return 0 +def _raise_on_missing_project_hash() -> bool: + """Check if an error should be raised when project hash is missing. + + When running reflex with --backend-only, or doing database migration + operations, there is no requirement for a .web directory, so the reflex.json + file may not exist, and this should not be considered an error. + + Returns: + False when compilation should be skipped (i.e. no .web directory is required). + Otherwise return True. + """ + if should_skip_compile(): + return False + return True + + def _prepare_event(event: str) -> dict: """Prepare the event to be sent to the PostHog server. @@ -74,7 +91,7 @@ def _prepare_event(event: str) -> dict: The event data. """ installation_id = ensure_reflex_installation_id() - project_hash = get_project_hash(raise_on_fail=True) + project_hash = get_project_hash(raise_on_fail=_raise_on_missing_project_hash()) if installation_id is None or project_hash is None: console.debug(