Django Mezzanine Fabric部署报错:SECRET_KEY为空及settings模块未找到
看起来你在DigitalOcean的Ubuntu 14 Droplet上部署Django项目时遇到了两个关联问题:部署脚本找不到settings模块,以及SECRET_KEY无法从local_settings读取。我来一步步帮你排查解决:
一、先解决ModuleNotFoundError: No module named 'project.settings'
从fab deploy的执行日志来看,脚本进入了/home/adm/mezzanine/project目录,但Python找不到project.settings模块,这通常是Python路径问题或者项目结构不匹配导致的:
1. 检查项目目录结构
登录到你的Droplet,进入/home/adm/mezzanine/project目录,执行ls -la查看结构,确认是否有如下层级:
/home/adm/mezzanine/project/ ├── project/ # 这里应该是包含settings.py的Django项目根目录 │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── ...(其他文件,比如manage.py)
如果project目录不存在,或者里面没有__init__.py和settings.py,说明你的项目上传路径有误,或者本地Git仓库的结构和服务器上的路径不匹配。
2. 调整DJANGO_SETTINGS_MODULE的路径
如果/home/adm/mezzanine/project是你的Django项目根目录(即包含manage.py的目录),那么正确的DJANGO_SETTINGS_MODULE应该是settings而不是project.settings;或者你需要把当前目录加入Python路径。
修改fabfile中的deploy任务命令,把:
"import os;os.environ['DJANGO_SETTINGS_MODULE']='project.settings';import django;django.setup();from django.conf import settings;print(settings.STATIC_ROOT)"
改成:
"import os;os.environ['DJANGO_SETTINGS_MODULE']='settings';import django;django.setup();from django.conf import settings;print(settings.STATIC_ROOT)"
或者,在执行命令前先把当前目录加入Python路径:
"import os,sys;sys.path.insert(0, os.getcwd());os.environ['DJANGO_SETTINGS_MODULE']='project.settings';import django;django.setup();from django.conf import settings;print(settings.STATIC_ROOT)"
3. 检查虚拟环境的Python版本
注意到服务器上的虚拟环境用的是Python3.6,而你本地是Win7环境,确认本地项目的Python版本和服务器虚拟环境版本兼容,避免因为版本差异导致模块导入问题。
二、解决SECRET_KEY未读取local_settings的问题
当解决了ModuleNotFoundError之后,SECRET_KEY的问题通常是settings.py没有正确导入local_settings,或者文件权限问题:
1. 确认settings.py中导入了local_settings
打开服务器上的settings.py文件,检查是否有如下代码:
try: from .local_settings import * except ImportError: pass
如果没有,添加这段代码,确保local_settings中的配置会覆盖settings.py的默认配置。注意路径要正确,如果local_settings在同级目录,用相对导入;如果在其他位置,调整导入路径。
2. 检查local_settings文件的权限和存在性
登录服务器,确认local_settings.py存在于正确的目录(和settings.py同级),并且权限设置正确,确保虚拟环境的用户(adm)有读取权限:
ls -l /home/adm/mezzanine/project/project/local_settings.py # 如果权限不足,执行: chmod 644 /home/adm/mezzanine/project/project/local_settings.py
3. 验证SECRET_KEY是否被正确加载
在服务器上激活虚拟环境,进入项目目录,执行以下命令测试:
source /home/adm/.virtualenvs/project/bin/activate cd /home/adm/mezzanine/project python -c "import os;os.environ['DJANGO_SETTINGS_MODULE']='project.settings';import django;django.setup();from django.conf import settings;print(settings.SECRET_KEY)"
如果能正确输出SECRET_KEY,说明配置没问题;如果还是为空,检查local_settings.py中是否正确定义了SECRET_KEY = '你的密钥',注意引号是否正确,没有语法错误。
总结
先解决ModuleNotFoundError的问题,确保Django能正确找到settings模块,再验证SECRET_KEY的加载情况。大部分部署中的路径和配置问题都是因为目录结构或环境变量不匹配导致的,仔细核对服务器上的项目结构和本地的一致性通常能解决问题。
内容的提问来源于stack exchange,提问作者bullfighter

