通过WSGI部署Flask+MongoEngine至Apache遇ImportError问题求助
Flask + Apache WSGI 部署报错:ImportError: cannot import name connection
问题描述
我尝试通过WSGI将Flask应用部署到Apache服务器,连接服务器时Apache日志中出现如下错误:
mod_wsgi (pid=7884): Target WSGI script '/var/www/tracker/tracker/tracker.wsgi' cannot be loaded as Python module. mod_wsgi (pid=7884): Exception occurred processing WSGI script '/var/www/tracker/tracker/tracker.wsgi'. Traceback (most recent call last): File "/var/www/tracker/tracker/tracker.wsgi", line 3, in <module> from tracker import app as application File "/var/www/tracker/tracker/tracker.py", line 3, in <module> from flask_mongoengine import MongoEngine File "/var/www/tracker/lib/python3.5/site-packages/flask_mongoengine/__init__.py", line 6, in <module> import mongoengine File "/var/www/tracker/lib/python3.5/site-packages/mongoengine/__init__.py", line 2, in <module> from mongoengine import connection ImportError: cannot import name connection
目前毫无头绪,恳请技术指点。
解决方案
这个错误大概率是mongoengine与flask-mongoengine版本不兼容,或者WSGI没有正确使用虚拟环境导致的,咱们一步步来排查修复:
第一步:检查并修复依赖版本兼容性
旧版本的mongoengine和flask-mongoengine经常会出现导入路径不匹配的问题。先查看当前安装的版本:# 进入你的虚拟环境后执行 pip list | grep -E "mongoengine|flask-mongoengine"建议锁定一组经过验证的兼容版本,比如:
# 安装兼容的旧版本组合 pip install flask-mongoengine==0.9.5 mongoengine==0.10.7 --force-reinstall # 或者尝试较新的稳定组合 pip install flask-mongoengine==1.0.0 mongoengine==0.19.1 --force-reinstall第二步:确保WSGI脚本正确激活虚拟环境
Apache默认会使用系统全局的Python环境,而你的依赖都装在虚拟环境里,所以必须在tracker.wsgi开头添加虚拟环境激活代码:# 替换为你虚拟环境的activate_this.py路径 activate_this = '/var/www/tracker/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this)) # 原有的WSGI代码 import sys sys.path.insert(0, '/var/www/tracker/tracker') from tracker import app as application注意:
activate_this.py一般在虚拟环境的bin目录下,如果找不到,说明你的虚拟环境可能创建有问题,可以重新创建虚拟环境。第三步:修复文件权限问题
Apache的运行用户(通常是www-data)需要有访问项目目录和虚拟环境的权限,否则会无法读取依赖文件:sudo chown -R www-data:www-data /var/www/tracker sudo chmod -R 755 /var/www/tracker第四步:验证Python导入路径
如果上面的步骤都没解决,可以在tracker.py开头添加路径打印,确认虚拟环境的site-packages是否在Python的搜索路径里:import sys print("Python Path:", sys.path) from flask_mongoengine import MongoEngine重启Apache后查看错误日志,如果
/var/www/tracker/lib/python3.5/site-packages不在路径里,就在tracker.wsgi里手动添加:sys.path.insert(0, '/var/www/tracker/lib/python3.5/site-packages')
内容的提问来源于stack exchange,提问作者KirkyJ
相关产品推荐
相关产品推荐

