Apache+mod_wsgi部署Django遇ModuleNotFoundError: No module named 'team_db'
问题描述
目录结构
/var/www下的目录结构:
team_django --team_db ---- __init__.py -----settings.py -----wsgi.py
相关配置文件
wsgi.py 内容
import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'team_db.settings') application = get_wsgi_application()
/etc/apache2/mods-available/wsgi.load 配置
LoadModule wsgi_module "/usr/local/py_ptracker/lib/python3.11/site-packages/mod_wsgi/server/mod_wsgi-py311.cpython-311-x86_64-linux-gnu.so" WSGIPythonHome "/usr/local/py_ptracker"
/etc/apache2/sites-available/vhost.conf 配置
<VirtualHost *:80> ServerName mydomain WSGIScriptAlias / /var/www/team_django/team_db/wsgi.py <Directory /var/www/team_django/team_db> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
错误日志信息
Apache error.log 中出现以下错误:
ModuleNotFoundError: No module named 'team_db' [wsgi:error] [pid 225277] mod_wsgi (pid=225277): Failed to exec Python script file '/var/www/team_django/team_db/wsgi.py'., referer: ... [wsgi:error] [pid 225277] mod_wsgi (pid=225277): Exception occurred processing WSGI script '/var/www/team_django/team_db/wsgi.py'., referer: ....
用户疑问
明明项目能在 Django runserver 和 mod_wsgi-express 下正常运行,且 mod_wsgi 是用虚拟环境同版本 Python 编译的,也调整过权限和所有者,为什么 os.environ.setdefault 还是找不到 team_db 模块?
问题原因及解决方法
核心原因是Python 的模块搜索路径(sys.path)未包含 /var/www/team_django 目录,导致 Python 无法识别 team_db 这个包。Django 自带的 runserver 和 mod_wsgi-express 会自动把项目根目录加入搜索路径,但 Apache 下的 mod_wsgi 默认不会做这个操作。
解决方式二选一即可:
修改 wsgi.py 添加路径
在 wsgi.py 开头加入代码,手动把项目根目录加入 Python 搜索路径:import os import sys # 把项目根目录添加到模块搜索路径 sys.path.append('/var/www/team_django') from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'team_db.settings') application = get_wsgi_application()在 Apache 虚拟主机配置中设置 WSGIPythonPath
在 vhost.conf 的<VirtualHost>块内添加路径配置:<VirtualHost *:80> ServerName mydomain WSGIPythonPath /var/www/team_django WSGIScriptAlias / /var/www/team_django/team_db/wsgi.py <Directory /var/www/team_django/team_db> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
最后操作
修改完成后,重启 Apache 服务使配置生效:
sudo systemctl restart apache2
额外说明
- 本次报错和权限无关,若为权限问题,日志会明确提示权限相关错误;
- 确认
team_db目录下的__init__.py文件存在(你已满足),这是 Python 识别为包的必要条件。
内容的提问来源于stack exchange,提问作者HBMCS
相关产品推荐
相关产品推荐

