Skip to content

RecursionError: maximum recursion depth exceeded #867

@mohsen-rahmati-dev

Description

@mohsen-rahmati-dev

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 object

Expected 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions