瀏覽代碼

pick up env vars prefixed by REFLEX_ (#5312)

* pick up env vars prefixed by REFLEX_

* type annotate to ClassVar and fix warning

* forgot backticks

* fix an issue with loglevel not triggering deprecation message
Thomas Brandého 3 天之前
父節點
當前提交
2f17dafa0f
共有 2 個文件被更改,包括 34 次插入8 次删除
  1. 33 7
      reflex/config.py
  2. 1 1
      reflex/utils/console.py

+ 33 - 7
reflex/config.py

@@ -22,6 +22,7 @@ from typing import (
     TYPE_CHECKING,
     TYPE_CHECKING,
     Annotated,
     Annotated,
     Any,
     Any,
+    ClassVar,
     Generic,
     Generic,
     TypeVar,
     TypeVar,
     get_args,
     get_args,
@@ -894,6 +895,8 @@ class Config(Base):
     # Extra overlay function to run after the app is built. Formatted such that `from path_0.path_1... import path[-1]`, and calling it with no arguments would work. For example, "reflex.components.moment.moment".
     # Extra overlay function to run after the app is built. Formatted such that `from path_0.path_1... import path[-1]`, and calling it with no arguments would work. For example, "reflex.components.moment.moment".
     extra_overlay_function: str | None = None
     extra_overlay_function: str | None = None
 
 
+    _prefixes: ClassVar[list[str]] = ["REFLEX_"]
+
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
         """Initialize the config values.
         """Initialize the config values.
 
 
@@ -906,19 +909,32 @@ class Config(Base):
         """
         """
         super().__init__(*args, **kwargs)
         super().__init__(*args, **kwargs)
 
 
-        # Set the log level for this process
-        env_loglevel = os.environ.get("LOGLEVEL")
+        # Clean up this code when we remove plain envvar in 0.8.0
+        show_deprecation = False
+        env_loglevel = os.environ.get("REFLEX_LOGLEVEL")
+        if not env_loglevel:
+            env_loglevel = os.environ.get("LOGLEVEL")
+            if env_loglevel:
+                show_deprecation = True
         if env_loglevel is not None:
         if env_loglevel is not None:
             env_loglevel = LogLevel(env_loglevel.lower())
             env_loglevel = LogLevel(env_loglevel.lower())
         if env_loglevel or self.loglevel != LogLevel.DEFAULT:
         if env_loglevel or self.loglevel != LogLevel.DEFAULT:
             console.set_log_level(env_loglevel or self.loglevel)
             console.set_log_level(env_loglevel or self.loglevel)
 
 
+        if show_deprecation:
+            console.deprecate(
+                "Usage of deprecated LOGLEVEL env var detected.",
+                reason="Prefer `REFLEX_` prefix when setting env vars.",
+                deprecation_version="0.7.13",
+                removal_version="0.8.0",
+            )
+
         # Update the config from environment variables.
         # Update the config from environment variables.
         env_kwargs = self.update_from_env()
         env_kwargs = self.update_from_env()
         for key, env_value in env_kwargs.items():
         for key, env_value in env_kwargs.items():
             setattr(self, key, env_value)
             setattr(self, key, env_value)
 
 
-        # Update default URLs if ports were set
+        #   Update default URLs if ports were set
         kwargs.update(env_kwargs)
         kwargs.update(env_kwargs)
         self._non_default_attributes.update(kwargs)
         self._non_default_attributes.update(kwargs)
         self._replace_defaults(**kwargs)
         self._replace_defaults(**kwargs)
@@ -928,7 +944,7 @@ class Config(Base):
             and not self.redis_url
             and not self.redis_url
         ):
         ):
             raise ConfigError(
             raise ConfigError(
-                "REDIS_URL is required when using the redis state manager."
+                f"{self._prefixes[0]}REDIS_URL is required when using the redis state manager."
             )
             )
 
 
     @property
     @property
@@ -969,7 +985,18 @@ class Config(Base):
         # Iterate over the fields.
         # Iterate over the fields.
         for key, field in self.__fields__.items():
         for key, field in self.__fields__.items():
             # The env var name is the key in uppercase.
             # The env var name is the key in uppercase.
-            env_var = os.environ.get(key.upper())
+            for prefix in self._prefixes:
+                if env_var := os.environ.get(f"{prefix}{key.upper()}"):
+                    break
+            else:
+                # Default to non-prefixed env var if other are not found.
+                if env_var := os.environ.get(key.upper()):
+                    console.deprecate(
+                        f"Usage of deprecated {key.upper()} env var detected.",
+                        reason=f"Prefer `{self._prefixes[0]}` prefix when setting env vars.",
+                        deprecation_version="0.7.13",
+                        removal_version="0.8.0",
+                    )
 
 
             # If the env var is set, override the config value.
             # If the env var is set, override the config value.
             if env_var and env_var.strip():
             if env_var and env_var.strip():
@@ -989,7 +1016,6 @@ class Config(Base):
                         f"Overriding config value {key} with env var {key.upper()}={env_var}",
                         f"Overriding config value {key} with env var {key.upper()}={env_var}",
                         dedupe=True,
                         dedupe=True,
                     )
                     )
-
         return updated_values
         return updated_values
 
 
     def get_event_namespace(self) -> str:
     def get_event_namespace(self) -> str:
@@ -1041,7 +1067,7 @@ class Config(Base):
         """
         """
         for key, value in kwargs.items():
         for key, value in kwargs.items():
             if value is not None:
             if value is not None:
-                os.environ[key.upper()] = str(value)
+                os.environ[self._prefixes[0] + key.upper()] = str(value)
             setattr(self, key, value)
             setattr(self, key, value)
         self._non_default_attributes.update(kwargs)
         self._non_default_attributes.update(kwargs)
         self._replace_defaults(**kwargs)
         self._replace_defaults(**kwargs)

+ 1 - 1
reflex/utils/console.py

@@ -65,7 +65,7 @@ def set_log_level(log_level: LogLevel | None):
     global _LOG_LEVEL
     global _LOG_LEVEL
     if log_level != _LOG_LEVEL:
     if log_level != _LOG_LEVEL:
         # Set the loglevel persistenly for subprocesses.
         # Set the loglevel persistenly for subprocesses.
-        os.environ["LOGLEVEL"] = log_level.value
+        os.environ["REFLEX_LOGLEVEL"] = log_level.value
     _LOG_LEVEL = log_level
     _LOG_LEVEL = log_level