在 Apache24 上部署 Django 时不存在自定义 ModuleNotFound 错误

问题描述 投票:0回答:1

问题

我有一个使用 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
命令时,它们会重置为“错误”值。

最后,当我在不同的环境中本地测试该项目时,不会出现此错误。

django apache deployment environment-variables importerror
1个回答
0
投票

嗯,这很尴尬......显然

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”解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.