拆分settings.py后Apache+mod_wsgi部署Django项目报错求助
问题背景
在Windows环境下使用Apache和mod_wsgi部署Django项目,将settings.py拆分为多文件结构后,出现mod_wsgi无法执行WSGI脚本的错误,具体报错指向wsgi.py中的application = get_wsgi_application()语句。
项目结构如下:
- 源码根目录 - 项目目录 - apps - config - settings - __init__.py - base.py - local.py - prod.py - __init__.py - asgi.py - urls.py - wsgi.py - myenv
当前wsgi.py代码:
# project_folder/wsgi.py import os from django.core.wsgi import get_wsgi_application import sys sys.path.append('C:/Apache24/htdocs/ C:/user/users/desktop/source_root_folder') os.environ['DJANGO_SETTINGS_MODULE'] = 'project_folder.config.settings' os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_folder.config.settings') application = get_wsgi_application()
解决方案
1. 修复sys.path的路径格式错误
你在sys.path.append中把两个路径合并到了同一个字符串里,Python无法识别这种格式,需要分开添加:
sys.path.append('C:/user/users/desktop/source_root_folder') sys.path.append('C:/user/users/desktop/source_root_folder/project_folder')
优先添加源码根目录和项目目录,确保Python能找到project_folder包以及内部的config.settings模块。
2. 确认settings模块的导入逻辑
拆分settings后,config/settings/__init__.py需要明确导入对应环境的配置文件,比如生产环境导入prod.py:
# config/settings/__init__.py from .prod import *
测试环境则导入local.py,保证DJANGO_SETTINGS_MODULE指向的project_folder.config.settings能正确加载配置。
3. 保证Python环境一致性
mod_wsgi使用的Python版本必须和你的虚拟环境myenv完全一致,否则会出现依赖或模块找不到的问题:
- 确认Apache的mod_wsgi是针对虚拟环境的Python版本编译的;
- 在
wsgi.py开头添加虚拟环境激活代码:
activate_this = 'C:/user/users/desktop/source_root_folder/myenv/Scripts/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this))
4. 修正环境变量重复设置
你重复设置了DJANGO_SETTINGS_MODULE,保留一行即可,推荐用setdefault避免意外覆盖:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_folder.config.settings')
5. 检查Apache配置正确性
确保Apache的httpd.conf或虚拟主机配置中,WSGI脚本路径和Python路径设置正确:
WSGIScriptAlias / "C:/user/users/desktop/source_root_folder/project_folder/wsgi.py" WSGIPythonPath "C:/user/users/desktop/source_root_folder;C:/user/users/desktop/source_root_folder/project_folder" <Directory "C:/user/users/desktop/source_root_folder/project_folder"> <Files wsgi.py> Require all granted </Files> </Directory>
6. 查看详细错误日志定位问题
如果仍报错,打开Apache错误日志(通常在Apache24/logs/error.log),找到application = get_wsgi_application()对应的具体异常(比如ModuleNotFoundError、ImportError),根据缺失的模块或路径进一步排查。
内容的提问来源于stack exchange,提问作者jin

