Skip to content

Commit 2f17daf

Browse files
authored
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
1 parent 59bbdcd commit 2f17daf

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

reflex/config.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
TYPE_CHECKING,
2323
Annotated,
2424
Any,
25+
ClassVar,
2526
Generic,
2627
TypeVar,
2728
get_args,
@@ -894,6 +895,8 @@ class Config: # pyright: ignore [reportIncompatibleVariableOverride]
894895
# 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".
895896
extra_overlay_function: str | None = None
896897

898+
_prefixes: ClassVar[list[str]] = ["REFLEX_"]
899+
897900
def __init__(self, *args, **kwargs):
898901
"""Initialize the config values.
899902
@@ -906,19 +909,32 @@ def __init__(self, *args, **kwargs):
906909
"""
907910
super().__init__(*args, **kwargs)
908911

909-
# Set the log level for this process
910-
env_loglevel = os.environ.get("LOGLEVEL")
912+
# Clean up this code when we remove plain envvar in 0.8.0
913+
show_deprecation = False
914+
env_loglevel = os.environ.get("REFLEX_LOGLEVEL")
915+
if not env_loglevel:
916+
env_loglevel = os.environ.get("LOGLEVEL")
917+
if env_loglevel:
918+
show_deprecation = True
911919
if env_loglevel is not None:
912920
env_loglevel = LogLevel(env_loglevel.lower())
913921
if env_loglevel or self.loglevel != LogLevel.DEFAULT:
914922
console.set_log_level(env_loglevel or self.loglevel)
915923

924+
if show_deprecation:
925+
console.deprecate(
926+
"Usage of deprecated LOGLEVEL env var detected.",
927+
reason="Prefer `REFLEX_` prefix when setting env vars.",
928+
deprecation_version="0.7.13",
929+
removal_version="0.8.0",
930+
)
931+
916932
# Update the config from environment variables.
917933
env_kwargs = self.update_from_env()
918934
for key, env_value in env_kwargs.items():
919935
setattr(self, key, env_value)
920936

921-
# Update default URLs if ports were set
937+
# Update default URLs if ports were set
922938
kwargs.update(env_kwargs)
923939
self._non_default_attributes.update(kwargs)
924940
self._replace_defaults(**kwargs)
@@ -928,7 +944,7 @@ def __init__(self, *args, **kwargs):
928944
and not self.redis_url
929945
):
930946
raise ConfigError(
931-
"REDIS_URL is required when using the redis state manager."
947+
f"{self._prefixes[0]}REDIS_URL is required when using the redis state manager."
932948
)
933949

934950
@property
@@ -969,7 +985,18 @@ def update_from_env(self) -> dict[str, Any]:
969985
# Iterate over the fields.
970986
for key, field in self.__fields__.items():
971987
# The env var name is the key in uppercase.
972-
env_var = os.environ.get(key.upper())
988+
for prefix in self._prefixes:
989+
if env_var := os.environ.get(f"{prefix}{key.upper()}"):
990+
break
991+
else:
992+
# Default to non-prefixed env var if other are not found.
993+
if env_var := os.environ.get(key.upper()):
994+
console.deprecate(
995+
f"Usage of deprecated {key.upper()} env var detected.",
996+
reason=f"Prefer `{self._prefixes[0]}` prefix when setting env vars.",
997+
deprecation_version="0.7.13",
998+
removal_version="0.8.0",
999+
)
9731000

9741001
# If the env var is set, override the config value.
9751002
if env_var and env_var.strip():
@@ -989,7 +1016,6 @@ def update_from_env(self) -> dict[str, Any]:
9891016
f"Overriding config value {key} with env var {key.upper()}={env_var}",
9901017
dedupe=True,
9911018
)
992-
9931019
return updated_values
9941020

9951021
def get_event_namespace(self) -> str:
@@ -1041,7 +1067,7 @@ def _set_persistent(self, **kwargs):
10411067
"""
10421068
for key, value in kwargs.items():
10431069
if value is not None:
1044-
os.environ[key.upper()] = str(value)
1070+
os.environ[self._prefixes[0] + key.upper()] = str(value)
10451071
setattr(self, key, value)
10461072
self._non_default_attributes.update(kwargs)
10471073
self._replace_defaults(**kwargs)

reflex/utils/console.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def set_log_level(log_level: LogLevel | None):
6565
global _LOG_LEVEL
6666
if log_level != _LOG_LEVEL:
6767
# Set the loglevel persistenly for subprocesses.
68-
os.environ["LOGLEVEL"] = log_level.value
68+
os.environ["REFLEX_LOGLEVEL"] = log_level.value
6969
_LOG_LEVEL = log_level
7070

7171

0 commit comments

Comments
 (0)