Несуществующая пользовательская ошибка ModuleNotFound при развертывании Django на Apache24
Проблема
У меня есть развертывание Django с Apache24, которое ранее работало, как и ожидалось, с именем проекта django "API_Materials". Однако, когда я попытался создать новые миграции с помощью команды python manage.py makemigrations
, с которой раньше никогда не возникало проблем, я получил следующий stacktrace:
(venv) C:\API\BD_API_Materials>python manage.py makemigrations
Traceback (most recent call last):
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\base.py", line 412, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\base.py", line 453, in execute
self.check()
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\base.py", line 485, in check
all_issues = checks.run_checks(
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\checks\registry.py", line 88, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\checks\urls.py", line 36, in check_url_namespaces_unique
if not getattr(settings, "ROOT_URLCONF", None):
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 102, in __getattr__
self._setup(name)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 89, in _setup
self._wrapped = Settings(settings_module)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 217, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\Program Files\Python310\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'MaterialsAPI'
Модуль, который пытался использовать проект, называется "MaterialsAPI", а проект - "API_Materials". Однако "MaterialsAPI", скорее всего, является пользовательским именем, созданным для этого проекта, однако этот текст не существует ни в одном существующем файле проекта.
Отладка
Сначала я попробовал вернуться "назад во времени" с помощью команды git reset --hard
с внешней резервной копией текущей ситуации, но это не устранило проблему. Пока я пытался проверить, является ли это специфичным для команды makemigrations
, я попробовал проверить несуществующую команду makemigration
, но ошибка по-прежнему сохранялась:
(venv) C:\API\BD_API_Materials>python manage.py makemigration
Traceback (most recent call last):
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\__init__.py", line 255, in fetch_command
app_name = commands[subcommand]
KeyError: 'makemigration'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\API\BD_API_Materials\manage.py", line 22, in <module>
main()
File "C:\API\BD_API_Materials\manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
utility.execute()
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\core\management\__init__.py", line 262, in fetch_command
settings.INSTALLED_APPS
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 102, in __getattr__
self._setup(name)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 89, in _setup
self._wrapped = Settings(settings_module)
File "C:\Users\afonso.campos\Desktop\BD_API_Materials\API\venv\lib\site-packages\django\conf\__init__.py", line 217, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\Program Files\Python310\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'MaterialsAPI'
Анализируя трассировку стека, казалось, что ошибка возникает из-за того, что он существует в секции INSTALLED_APPS
в settings.py
, но это было не так.
INSTALLED_APPS = [
'corsheaders',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'API_Materials.apps.ApiMaterialsConfig',
'rest_framework',
'rest_framework.authtoken',
'django_extensions',
'drf_yasg',
'cryptographic_fields'
]
При дальнейшей отладке я заметил, что каталог изменился в середине выполнения (раньше это был " C:\API\BD_API_Materials\ ", правильный каталог для проекта, а затем перешел к определенному пользователю. Возможно, это произошло из-за настройки apache, которая использовала неправильный каталог виртуального окружения, но я попытался изменить его и перезапустить сервер Apache, что все равно не помогло. Однако в этом неправильном каталоге слово "MaterialsAPI" по-прежнему не существовало, как и в этой среде.
Если посмотреть на переменные окружения перед строкой, вызывающей ошибку settings.INSTALLED_APPS
, то текст "MaterialsAPI" был найден, причем в неправильном каталоге:
environ({
...
'VIRTUAL_ENV': 'C:\\Users\\afonso.campos\\Desktop\\BD_API_Materials\\API\\venv',
'DJANGO_SETTINGS_MODULE': 'MaterialsAPI.settings'
...
})
Затем я пытаюсь "принудительно" внести изменения в виртуальную среду, однако при выполнении команды manage.py
они возвращаются к своим "неправильным" значениям.
И наконец, эта ошибка не возникает, когда я тестирую проект локально в другой среде.
Ну, это неловко... Судя по всему, в файле django manage.py
была строка os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MaterialsAPI.settings')
, но не локально, а только на git и в deployment. Это почему-то прошло мимо проверки в Visual Studio Code на проверку "MaterialsAPI" в любом файле внутри проекта. Я не знаю, когда произошло это изменение, так как локальный проект никогда не жаловался на это.
Переход на os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'API_Materials.settings')
решил проблему, вернув исходное имя проекта "API_Materials".