Django部署到Ubuntu20.04后访问站点报1045数据库错误但manage.py操作正常
问题诱因
核心原因是部署后的Django Web进程未正确加载你编写的settings.py数据库配置,具体触发场景通常为以下几种:
- 配置模块加载错误:若你的项目拆分了开发/生产两套独立的settings配置,Web服务启动时加载的生产配置未修改数据库参数,仍为默认的root无密码配置;而你手动执行manage.py命令时默认加载开发配置,因此数据库操作正常。
- 环境变量覆盖配置:项目使用了
django-environ、dj-database-url这类依赖环境变量的配置工具,Web进程运行环境中未配置DATABASE_URL或变量值错误,工具自动 fallback 到MySQL默认的root无密码连接参数,覆盖了你硬编码在settings.py中的配置。 - 服务启动参数错误:使用systemd、supervisor托管Web服务(Gunicorn/uWSGI等)时,未正确传递
DJANGO_SETTINGS_MODULE环境变量,或指定的配置文件路径错误,导致Django加载了初始默认配置。 - WSGI入口逻辑错误:项目的wsgi.py/asgi.py入口文件存在手动覆盖
DATABASES配置的代码,或错误修改了settings模块的加载逻辑。
解决方案
按优先级依次排查修复:
- 验证配置加载一致性
在项目根目录新建测试脚本test_db_conf.py,写入以下代码:
import os import django # 替换为你实际的项目配置模块名 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") django.setup() from django.conf import settings print("Current database config:", settings.DATABASES['default'])
首先手动执行python3 test_db_conf.py,确认输出的配置和你编写的pplus_user参数一致。再用Web服务的运行用户(通常为www-data)执行:sudo -u www-data python3 test_db_conf.py,如果输出为root无密码配置,即可确认是进程运行环境的配置问题。
2. 排查环境变量覆盖逻辑
检查settings.py中是否存在以下类似代码:
import dj_database_url DATABASES = { 'default': dj_database_url.config(default='mysql://root@localhost/') }
如果存在,可直接删除这段逻辑保留你的硬编码配置,也可以在Web服务的启动配置中添加正确的DATABASE_URL环境变量:
mysql://pplus_user:dfa@4GL-5qQU@localhost:3306/pplus_db
- 修复服务启动配置
以systemd托管Gunicorn为例,在你的.service配置文件的[Service]段添加以下配置:
Environment="DJANGO_SETTINGS_MODULE=your_project_name.settings" # 若使用环境变量配置数据库则添加下面这行 Environment="DATABASE_URL=mysql://pplus_user:dfa@4GL-5qQU@localhost:3306/pplus_db"
修改完成后执行systemctl daemon-reload,再重启Web服务即可生效。
4. 核对WSGI入口文件
确认项目根目录的wsgi.py文件中,os.environ.setdefault指定的配置模块路径正确,无其他覆盖DATABASES参数的冗余代码。
5. 核对多环境配置文件
若你的项目拆分了多套settings配置,确认生产环境配置文件中的数据库参数和你编写的一致,同时Web服务启动时指定的配置模块为生产配置模块。
内容的提问来源于stack exchange,提问作者Martian4x
相关产品推荐
相关产品推荐

