已安装nocaptcha_recaptcha仍遇ImportError?多Python项目服务器部署问题
这问题我见得太多了——核心就是Python环境不匹配:你明明装了nocaptcha_recaptcha模块,但Apache的mod_wsgi用的Python环境根本找不到它。单项目服务器和本地环境都是单一Python环境,没冲突;但多项目服务器里不同项目用不同Python版本/虚拟环境,很容易就串了。
下面是一步步的排查和解决方法:
1. 先确认mod_wsgi绑定的Python版本
服务器上大概率同时存在Python2.7(其他项目在用)和你的项目依赖的Python版本(比如Python3.x),而mod_wsgi默认可能绑定的是系统Python2.7,刚好和你装模块的环境不是同一个。
运行这条命令查看mod_wsgi关联的Python版本:
mod_wsgi-express module-config
看输出里的LoadModule wsgi_module路径,里面会带Python版本号(比如python3.5),对比你本地开发用的版本,以及安装模块时用的pip对应的版本。
2. 检查模块的实际安装路径
运行下面的命令,找到nocaptcha_recaptcha的安装位置:
# 如果用的是Python3的pip pip3 show nocaptcha_recaptcha # 要是用了虚拟环境,先激活虚拟环境再运行pip show
看输出里的Location字段,比如/home/your_user/venv/lib/python3.5/site-packages。接下来要确认这个路径是否在mod_wsgi的Python搜索范围内。
3. 用虚拟环境彻底隔离你的项目环境
这是最稳妥的解决方式,完全避免和其他Python2.7项目冲突:
- 先为你的Django项目创建并激活专属虚拟环境:
python3 -m venv /path/to/your/venv source /path/to/your/venv/bin/activate pip install django nocaptcha_recaptcha # 重新安装所有项目依赖
- 修改你的
wsgi.py文件,在开头添加虚拟环境激活代码:
activate_this = '/path/to/your/venv/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this)) # 保留原来的WSGI代码 import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'crowdfunder.settings') application = get_wsgi_application()
- 最后修改Apache的站点配置文件(比如
/etc/apache2/sites-available/crowdfunder.conf),明确指定虚拟环境:
<VirtualHost *:80> ServerName your-domain.com DocumentRoot /var/www/crowdfunder WSGIDaemonProcess crowdfunder python-home=/path/to/your/venv WSGIProcessGroup crowdfunder WSGIScriptAlias / /var/www/crowdfunder/crowdfunder/wsgi.py <Directory /var/www/crowdfunder/crowdfunder> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
4. 重启Apache并验证配置
修改完所有内容后,重启Apache服务:
sudo systemctl restart apache2
如果还是报错,检查文件权限——确保Apache的运行用户www-data能访问你的项目目录和虚拟环境:
sudo chown -R www-data:www-data /var/www/crowdfunder sudo chmod -R 755 /path/to/your/venv
简单说下为什么本地和单项目Droplet没问题:那些环境里只有一套Python环境,你装模块的环境和运行项目的环境完全一致,自然不会有找不到模块的问题;但多项目服务器是混合环境,mod_wsgi默认捡了其他项目的Python环境,当然找不到你的模块。
内容的提问来源于stack exchange,提问作者HenryM

