django-environ icon indicating copy to clipboard operation
django-environ copied to clipboard

Does the option to disable interpolation even work?

Open amatmv opened this issue 8 months ago • 0 comments

I want to turn off the interpolation feature because I don't use it, but instead, take the raw value of the variable. The solution to disable interpolation in the docs doesn't seem to work.

Here are two examples of getting the raw value of a variable FOO that starts with $, using the latest version 0.11.2

Defining the variable in the .env

# .env file
FOO="$BAR"
# python
In [1]: import environ
In [2]: env = environ.Env(interpolate=False)
In [3]: env('FOO')
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
File /usr/local/lib/python3.9/site-packages/environ/environ.py:388, in Env.get_value(self, var, cast, default, parse_default)
    387 try:
--> 388     value = self.ENVIRON[var_name]
    389 except KeyError as exc:

File /usr/local/lib/python3.9/os.py:679, in _Environ.__getitem__(self, key)
    677 except KeyError:
    678     # raise KeyError with the original key value
--> 679     raise KeyError(key) from None
    680 return self.decodevalue(value)

KeyError: 'BAR'

The above exception was the direct cause of the following exception:

ImproperlyConfigured                      Traceback (most recent call last)
Cell In[2], line 3
      1 import environ
      2 env = environ.Env(interpolate=False)
----> 3 env('FOO')

File /usr/local/lib/python3.9/site-packages/environ/environ.py:199, in Env.__call__(self, var, cast, default, parse_default)
    198 def __call__(self, var, cast=None, default=NOTSET, parse_default=False):
--> 199     return self.get_value(
    200         var,
    201         cast=cast,
    202         default=default,
    203         parse_default=parse_default
    204     )

File /usr/local/lib/python3.9/site-packages/environ/environ.py:401, in Env.get_value(self, var, cast, default, parse_default)
    399 if hasattr(value, 'startswith') and value.startswith(prefix):
    400     value = value.lstrip(prefix)
--> 401     value = self.get_value(value, cast=cast, default=default)
    403 if self.escape_proxy and hasattr(value, 'replace'):
    404     value = value.replace(escape, prefix)

File /usr/local/lib/python3.9/site-packages/environ/environ.py:392, in Env.get_value(self, var, cast, default, parse_default)
    390     if default is self.NOTSET:
    391         error_msg = f'Set the {var} environment variable'
--> 392         raise ImproperlyConfigured(error_msg) from exc
    394     value = default
    396 # Resolve any proxied values

ImproperlyConfigured: Set the BAR environment variable
Same use case but populating from default values

In [1]: import environ
In [2]: env = environ.Env(interpolate=False, FOO=('str', '$BAR'))
In [3]: env('FOO')
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
Cell In[17], line 1
----> 1 env('FOO')

File /usr/local/lib/python3.9/site-packages/environ/environ.py:199, in Env.__call__(self, var, cast, default, parse_default)
    198 def __call__(self, var, cast=None, default=NOTSET, parse_default=False):
--> 199     return self.get_value(
    200         var,
    201         cast=cast,
    202         default=default,
    203         parse_default=parse_default
    204     )

File /usr/local/lib/python3.9/site-packages/environ/environ.py:401, in Env.get_value(self, var, cast, default, parse_default)
    399 if hasattr(value, 'startswith') and value.startswith(prefix):
    400     value = value.lstrip(prefix)
--> 401     value = self.get_value(value, cast=cast, default=default)
    403 if self.escape_proxy and hasattr(value, 'replace'):
    404     value = value.replace(escape, prefix)

File /usr/local/lib/python3.9/site-packages/environ/environ.py:401, in Env.get_value(self, var, cast, default, parse_default)
    399 if hasattr(value, 'startswith') and value.startswith(prefix):
    400     value = value.lstrip(prefix)
--> 401     value = self.get_value(value, cast=cast, default=default)
    403 if self.escape_proxy and hasattr(value, 'replace'):
    404     value = value.replace(escape, prefix)

    [... skipping similar frames: Env.get_value at line 401 (2977 times)]

File /usr/local/lib/python3.9/site-packages/environ/environ.py:401, in Env.get_value(self, var, cast, default, parse_default)
    399 if hasattr(value, 'startswith') and value.startswith(prefix):
    400     value = value.lstrip(prefix)
--> 401     value = self.get_value(value, cast=cast, default=default)
    403 if self.escape_proxy and hasattr(value, 'replace'):
    404     value = value.replace(escape, prefix)

File /usr/local/lib/python3.9/site-packages/environ/environ.py:388, in Env.get_value(self, var, cast, default, parse_default)
    385             cast = var_info
    387 try:
--> 388     value = self.ENVIRON[var_name]
    389 except KeyError as exc:
    390     if default is self.NOTSET:

File /usr/local/lib/python3.9/os.py:676, in _Environ.__getitem__(self, key)
    674 def __getitem__(self, key):
    675     try:
--> 676         value = self._data[self.encodekey(key)]
    677     except KeyError:
    678         # raise KeyError with the original key value
    679         raise KeyError(key) from None

File /usr/local/lib/python3.9/os.py:755, in _createenviron.<locals>.encode(value)
    754 def encode(value):
--> 755     if not isinstance(value, str):
    756         raise TypeError("str expected, not %s" % type(value).__name__)
    757     return value.encode(encoding, 'surrogateescape')

RecursionError: maximum recursion depth exceeded while calling a Python object

amatmv avatar Jun 18 '24 13:06 amatmv