我有一个使用 Apache24 的 Django 部署,它按之前的预期工作,django 项目名称为“API_Materials”。然而,当我尝试使用
python manage.py makemigrations
(一个以前从未出现过任何问题的命令)进行新迁移时,我得到了以下堆栈跟踪:
(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
命令时,它们会重置为“错误”值。
最后,当我在不同的环境中本地测试该项目时,不会出现此错误。
嗯,这很尴尬......显然
manage.py
django 文件有 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MaterialsAPI.settings')
行,但不是本地的,只在 git 上和部署中。由于某种原因,Visual Studio Code 中的验证通过了验证,以验证项目内任何文件中的“MaterialsAPI”。我不知道这个变化是什么时候发生的,因为当地项目从未抱怨过。
更改为
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'API_Materials.settings')
,通过返回原始项目名称“API_Materials”解决了问题。