diff --git a/reflex/app.py b/reflex/app.py index 0aefe0a9a..984428375 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -504,7 +504,7 @@ class App(MiddlewareMixin, LifespanMixin): if not self.api: return upload_is_used_marker = ( - prerequisites.get_web_dir() / "backend" / "upload_is_used" + prerequisites.get_backend_dir() / constants.Dirs.UPLOAD_IS_USED ) if Upload.is_used or upload_is_used_marker.exists(): # To upload files. @@ -982,11 +982,12 @@ class App(MiddlewareMixin, LifespanMixin): return str(datetime.now().time()).split(".")[0] should_compile = self._should_compile() - backend_dir = prerequisites.get_web_dir() / "backend" + backend_dir = prerequisites.get_backend_dir() if not should_compile and backend_dir.exists(): - enable_state_marker = backend_dir / "enable_state" - if enable_state_marker.exists(): - stateful_pages = json.load(enable_state_marker.open("r")) + stateful_pages_marker = backend_dir / constants.Dirs.STATEFUL_PAGES + if stateful_pages_marker.exists(): + with stateful_pages_marker.open("r") as f: + stateful_pages = json.load(f) for route in stateful_pages: console.info(f"BE Evaluating stateful page: {route}") self._compile_page(route, save_page=False) @@ -1235,9 +1236,12 @@ class App(MiddlewareMixin, LifespanMixin): # Pickle dynamic states if self._state is not None: - enable_state = prerequisites.get_web_dir() / "backend" / "enable_state" - enable_state.parent.mkdir(parents=True, exist_ok=True) - json.dump(list(self._stateful_pages), enable_state.open("w")) + stateful_pages_marker = ( + prerequisites.get_backend_dir() / constants.Dirs.STATEFUL_PAGES + ) + stateful_pages_marker.parent.mkdir(parents=True, exist_ok=True) + with stateful_pages_marker.open("w") as f: + json.dump(list(self._stateful_pages), f) @contextlib.asynccontextmanager async def modify_state(self, token: str) -> AsyncIterator[BaseState]: diff --git a/reflex/constants/base.py b/reflex/constants/base.py index 7fbcdf18a..0611c7d4c 100644 --- a/reflex/constants/base.py +++ b/reflex/constants/base.py @@ -53,6 +53,12 @@ class Dirs(SimpleNamespace): POSTCSS_JS = "postcss.config.js" # The name of the states directory. STATES = ".states" + # Where compilation artifacts for the backend are stored. + BACKEND = "backend" + # JSON-encoded list of page routes that need to be evaluated on the backend. + STATEFUL_PAGES = "stateful_pages.json" + # Marker file indicating that upload component was used in the frontend. + UPLOAD_IS_USED = "upload_is_used" class Reflex(SimpleNamespace): diff --git a/reflex/utils/prerequisites.py b/reflex/utils/prerequisites.py index 6c6d34923..c4e37f532 100644 --- a/reflex/utils/prerequisites.py +++ b/reflex/utils/prerequisites.py @@ -98,6 +98,15 @@ def get_states_dir() -> Path: return environment.REFLEX_STATES_WORKDIR.get() +def get_backend_dir() -> Path: + """Get the working directory for the backend. + + Returns: + The working directory. + """ + return get_web_dir() / constants.Dirs.BACKEND + + def check_latest_package_version(package_name: str): """Check if the latest version of the package is installed. diff --git a/reflex/vars/base.py b/reflex/vars/base.py index 50de0a022..c9dd81986 100644 --- a/reflex/vars/base.py +++ b/reflex/vars/base.py @@ -1996,9 +1996,6 @@ class ComputedVar(Var[RETURN_TYPE]): default_factory=lambda: lambda _: None ) # pyright: ignore [reportAssignmentType] - # Flag determines whether we are pickling the computed var itself - _is_pickling: ClassVar[bool] = False - def __init__( self, fget: Callable[[BASE_STATE], RETURN_TYPE], @@ -2410,8 +2407,6 @@ class ComputedVar(Var[RETURN_TYPE]): Returns: The class of the var. """ - if self._is_pickling: - return type(self) return FakeComputedVarBaseClass @property