瀏覽代碼

feat: allow disabling auto-setters via state_auto_setters config (#4480)

* feat: allow disabling auto-setters via REFLEX_AUTO_CREATE_SETTERS

* refactor to rx.Config

* add get config import

* add test and disable create set var

* we don't need to disable this guy

---------

Co-authored-by: Khaleel Al-Adhami <khaleel.aladhami@gmail.com>
benedikt-bartscher 1 周之前
父節點
當前提交
bbf38bbce3
共有 3 個文件被更改,包括 33 次插入1 次删除
  1. 3 0
      reflex/config.py
  2. 3 1
      reflex/state.py
  3. 27 0
      tests/units/test_state.py

+ 3 - 0
reflex/config.py

@@ -879,6 +879,9 @@ class Config(Base):
     # Path to file containing key-values pairs to override in the environment; Dotenv format.
     env_file: str | None = None
 
+    # Whether to automatically create setters for state base vars
+    state_auto_setters: bool = True
+
     # Whether to display the sticky "Built with Reflex" badge on all pages.
     show_built_with_reflex: bool | None = None
 

+ 3 - 1
reflex/state.py

@@ -1013,6 +1013,7 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
         Raises:
             VarTypeError: if the variable has an incorrect type
         """
+        from reflex.config import get_config
         from reflex.utils.exceptions import VarTypeError
 
         if not types.is_valid_var_type(prop._var_type):
@@ -1023,7 +1024,8 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
                 f'Found var "{prop._js_expr}" with type {prop._var_type}.'
             )
         cls._set_var(prop)
-        cls._create_setter(prop)
+        if get_config().state_auto_setters:
+            cls._create_setter(prop)
         cls._set_default_value(prop)
 
     @classmethod

+ 27 - 0
tests/units/test_state.py

@@ -3406,6 +3406,33 @@ config = rx.Config(
         del sys.modules[constants.Config.MODULE]
 
 
+def test_auto_setters_off(tmp_path):
+    proj_root = tmp_path / "project1"
+    proj_root.mkdir()
+
+    config_string = """
+import reflex as rx
+config = rx.Config(
+    app_name="project1",
+    state_auto_setters=False,
+)
+    """
+
+    (proj_root / "rxconfig.py").write_text(dedent(config_string))
+
+    with chdir(proj_root):
+        # reload config for each parameter to avoid stale values
+        reflex.config.get_config(reload=True)
+        from reflex.state import State
+
+        class TestState(State):
+            """A test state."""
+
+            num: int = 0
+
+        assert list(TestState.event_handlers) == ["setvar"]
+
+
 class MixinState(State, mixin=True):
     """A mixin state for testing."""