Django - настройки, похоже, кэшируются в неизвестном месте; как и где очистить python/django?
Я не могу запустить свой сервер Django после реструктуризации проекта в разные подпапки. Ошибка: "No module named..." для имени приложения, которое просто неверно в сообщении об ошибке, но не неверно в файле настроек. Я попытался удалить все приложения, кроме приложений по умолчанию, из "INSTALLED_APPS" в настройках. Ничего не изменилось. Поэтому я изменил файлы самого пакета Django следующим образом:
- в
django/apps/registry.py
я добавилprint(installed_apps)
- в
django/__init__.py
я добавилprint(settings)
С удивительными результатами. Настройки распечатались, как и ожидалось: он показал правильный "путь" к моему файлу настроек. Однако переменная installed_apps
вернула список установленных приложений, который был старым списком установленных приложений. Когда я добавляю или удаляю записи из моего файла настроек и повторно запускаю сервер, результат не меняется. Django, похоже, где-то "кэширует" переменную INSTALLED_APPS
- и я не могу найти, где и почему.
Интересно, я исследовал дальше:
Я больше не использую один файл настроек. После реструктуризации проекта я создал папку "settings", включающую файлы _base.py
со всеми основными настройками, prod.py
, dev.py
и __init__.py
.
prod.py
и dev.py
в настоящее время просто включают from _base import *
и все.
__init__.py
просто содержит from .prod import *
.
В моем manage.py
файле я установил путь только к папке "settings".
При печати переменной настроек django/__init__.py
она правильно возвращает путь, указанный в файле manage.py с добавлением ".prod", исходящий из моей новой папки настроек __init__.py
файла.
Так что все вроде бы работало. Теперь я изменил свой файл settings/__init__.py
и установил его в from .dev import *
.
Но оператор print внутри django/__init__.py
по-прежнему возвращает "старый" путь к файлу prod.py
. Значит, каким-то образом это тоже кэшируется.
Django, похоже, кэширует мой путь к настройкам и файл настроек, игнорируя __init__
файлы в пакетах в целом после того, как они были запущены хотя бы один раз в какой-то момент в прошлом. Но я просто не могу найти, где и как. Я использую PyCharm и просмотрел все файлы и каталоги, включая мои venv и скрытые файлы. Никаких следов.
Как найти и удалить кэшированные файлы и где/почему django кэширует здесь? Или это вообще django или что-то другое вызывает это?
Примечание: Я также пробовал
from django.core.cache import cache
cache.clear()
Ничего не изменилось. Я также не могу найти нигде директорию __pycache__
или какие-либо другие временные файлы.
Редактирование: Структура папки:
- src
- mydjangoproject
__init__.py
- apps
- news
- blog
- templates
- настройки
__init__.py
prod.py
dev.py
_base.py
manage.py
- mydjangoproject
Содержание manage.py
:
все по умолчанию, кроме строки 9:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjangoproject.settings')
Выдержка из моего файла настроек `_base.py':
INSTALLED_APPS = [
# Django apps
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# External apps
#'tinymce',
#'django_tex',
# Custom apps
'news',
'blog',
]
Выход django/apps/registry.py
-> print(installed_apps)
:
['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', newspaper, blogsite]
Ожидаемый результат (поскольку "newspaper" и "blogsite" были приложениями, которые были переименованы; apps.py был скорректирован соответствующим образом):
['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', news, blog]
Выход django/__init__.py
Я добавил print(settings)
:
mydjangoproject.settings.prod
Ожидаемый результат:
mydjangoproject.settings.dev
Потому что файл settings/__init__.py
был изменен с from .prod import *
на from .dev import *
Полное сообщение об ошибке при выполнении python manage.py runserver
:
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'mydjangoproject.apps.newspapermydjangoproject'
(Это скопировано правильно: Я не знаю, почему в конце строки стоит дополнительный "mydjangoproject". Это также возвращается, когда django перебирает переменную entry в своем config init.)