Heroku部署Django项目报localhost数据库连接拒绝错误解决方法
问题根因
这个报错本质是数据库配置没有适配Heroku的部署逻辑:
- 本地存敏感配置的
.env文件不会被部署到Heroku容器,代码里读取的DB_*系列变量在线上环境要么没值,要么你本地填的localhost在线上完全无效——Heroku的应用容器本身不运行PostgreSQL服务,连接127.0.0.1:5432自然会被拒绝。 - Heroku的PostgreSQL是独立托管的数据库实例,连接信息由平台自动注入,不是你本地写死的那套参数。
解决步骤
- 给Heroku应用挂载Postgres服务
打开Heroku后台对应应用的Resources标签,在Add-ons搜索框找到Heroku Postgres,选免费套餐开通即可。开通后平台会自动给应用注入一个DATABASE_URL环境变量,里面包含了线上数据库的完整连接信息(地址、端口、账号、密码、库名)。
注意:如果之前你手动在Heroku的Config Vars里填过DB_HOST=localhost,直接删掉,这个配置完全不符合Heroku的服务架构。 - 调整数据库配置兼容本地和线上环境
先在本地安装依赖:pip install dj-database-url psycopg2-binary,记得把这两个包加到requirements.txt里。
然后修改settings.py里的数据库配置:# 文件顶部新增导入 import dj_database_url # 保留本地开发用的原有数据库配置,后面追加线上环境覆盖逻辑 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': config('DB_NAME'), 'USER': config('DB_USER'), 'PASSWORD' : config('DB_PASSWORD'), 'HOST' : config('DB_HOST'), 'PORT': '5432', } } # 自动读取Heroku注入的DATABASE_URL覆盖本地配置,本地开发不受影响 DATABASES['default'].update(dj_database_url.config(conn_max_age=600, ssl_require=True)) - 检查
.gitignore配置
确认项目根目录的.gitignore里包含.env规则,不要把本地敏感配置文件提交到代码仓库。 - 重新部署并同步数据库结构
把修改后的代码推到Heroku,执行heroku run python manage.py migrate完成线上数据表创建,再访问/login接口就不会报连接错误了。
如果你不想用
dj-database-url,也可以手动去Heroku后台的Settings -> Config Vars页面,把Heroku Postgres提供的连接参数拆成DB_NAME/DB_USER/DB_PASSWORD/DB_HOST/DB_PORT逐个填入,但官方更推荐直接读取DATABASE_URL的方式,不用手动维护参数,后续数据库变更也不需要调整配置。
内容的提问来源于stack exchange,提问作者Avadhesh Yadav
相关产品推荐
相关产品推荐

