-
-
Notifications
You must be signed in to change notification settings - Fork 318
RecursionError: maximum recursion depth exceeded #867
Copy link
Copy link
Closed
Labels
Description
Describe the bug
Unintended Dynaconf behavior when explicitly setting lowercase_read=False and defining SECRET_KEY for a Django project.
To Reproduce
Steps to reproduce the behavior:
# project structure
.
├── manage.py
├── poetry.lock
├── pyproject.toml
├── settings.toml
└── src
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
# ./settings.toml
[default]
SECRET_KEY = "a"# ./src/settings.py
from pathlib import Path
import dynaconf
PROJECT_ROOT = Path(__file__).parent.parent.resolve(strict=True).as_posix()
settings = dynaconf.DjangoDynaconf(
__name__,
root_path=PROJECT_ROOT,
core_loaders=["TOML", "PY"],
settings_files=["settings.toml", "src.settings"],
secrets=".secrets.toml",
lowercase_read=False,
)❯ python manage.py shell
Traceback (most recent call last):
File "${PROJECT_DIR}/manage.py", line 22, in <module>
main()
File "${PROJECT_DIR}/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 386, in execute
settings.INSTALLED_APPS
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/django/conf/__init__.py", line 92, in __getattr__
self._setup(name)
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/django/conf/__init__.py", line 79, in _setup
self._wrapped = Settings(settings_module)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/django/conf/__init__.py", line 190, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${HOME}/.pyenv/versions/3.11.2/lib/python3.11/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "${PROJECT_DIR}/src/settings.py", line 7, in <module>
settings = dynaconf.DjangoDynaconf(
^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/contrib/django_dynaconf_v2.py", line 133, in load
if isinstance(
^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/functional.py", line 19, in inner
return func(self._wrapped, *args)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/base.py", line 296, in __getattribute__
return self._store.to_dict()[name]
^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/vendor/box/box.py", line 241, in to_dict
A=dict(D)
^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 21, in evaluate
if getattr(value, "_dynaconf_lazy_format", None):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/base.py", line 138, in __getattr__
value = getattr(self._wrapped, name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/base.py", line 296, in __getattribute__
return self._store.to_dict()[name]
^^^^^^^^^^^^^^^^^^^^^
.
.
.
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/base.py", line 296, in __getattribute__
return self._store.to_dict()[name]
^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/vendor/box/box.py", line 241, in to_dict
A=dict(D)
^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 21, in evaluate
if getattr(value, "_dynaconf_lazy_format", None):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 18, in evaluate
value = f(dynabox, item, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 38, in __getattr__
return super().__getattr__(item, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/vendor/box/box.py", line 166, in __getattr__
try:C=A.__getitem__(B,_ignore_default=_G)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 18, in evaluate
value = f(dynabox, item, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/utils/boxing.py", line 46, in __getitem__
return super().__getitem__(item, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "${PROJECT_DIR}/.venv/lib/python3.11/site-packages/dynaconf/vendor/box/box.py", line 151, in __getitem__
try:return super().__getitem__(A)
^^^^^^^^^^^^^^^^^^^^^^
RecursionError: maximum recursion depth exceeded while calling a Python objectExpected behavior
By removing either lowercase_read=False or SECRET_KEY, no Exception will be raised. expected to set the SECRET_KEY for the Django app.
Environment (please complete the following information):
- OS: Ubuntu 22.04
- Python Version: 3.11.2
- Dynaconf Version: 3.1.11
- Django Version: 4.1.7
Reactions are currently unavailable