【问题标题】:Connect Django to live Heroku Postgres database将 Django 连接到实时 Heroku Postgres 数据库
【发布时间】:2017-09-13 12:35:24
【问题描述】:

我已将 Postgres 数据库添加到我的 Heroku 应用程序中,并正在尝试将我的 Django 应用程序连接到它。但是,我的应用总是连接到本地 Postgres 数据库。

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'app_db',
        'USER': 'admin',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}

db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

我已将 .env 文件中的“DATABASE_URL”设置为 Heroku 应用程序上 Postgres 数据库的 url,但它似乎没有更新数据库。如何强制我的应用连接到 Heroku 数据库而不是本地数据库?

【问题讨论】:

  • 你能确认你的代码确实看到DATABASE_URL 环境变量类似于import os; print os.environ['DATABASE_URL'] 吗?只需将其放在db_from_env 变量之前,重新启动服务器并检查输出。
  • 它抛出一个 KeyError;似乎它实际上并没有看到它。我认为 dj_database_url.config() 应该读取 .env 文件并在那里获取 DATABASE_URL 值?如果我确实导出'DATABASE_URL'=postgres:blahblah,它似乎确实有效,但我不明白为什么它不能在.env中使用
  • 如果你真的想将你的环境变量存储在 .env 文件中,可以考虑使用https://github.com/theskumar/python-dotenv
  • dj_database_url.config() 不读取文件,而是检查环境变量值

标签: python django postgresql heroku


【解决方案1】:

从本地 Django 代码连接到 Live heroku DB,而无需手动设置 DATABASE_URL 环境变量:

将以下代码放入您的 settings.py 文件中

import os, subprocess, dj_database_url

bashCommand = “heroku config:get DATABASE_URL -a app_name” #Use your app_name

output = subprocess.check_output([‘bash’,’-c’, bashCommand]).decode(“utf-8”) # executing the bash command and converting byte to string

DATABASES[‘default’] = dj_database_url.config(default=output,conn_max_age=600, ssl_require=True) #making connection to heroku DB without having to set DATABASE_URL env variable

【讨论】:

    【解决方案2】:

    您可以将设置设置为在开发时从本地数据库读取,并在生产中使用您的 Heroku 数据库。首先,您可能已经知道,您需要dj_database_url

    您可以创建一个名为 local_settings.py 的单独设置文件,并在其中包含您的正常数据库配置(例如默认的 Django 数据库配置)。在你的settings.py:

    DATABASES = {
        'default': dj_database_url.config()
    }
    

    在你的底部settings.py:

    # Tries to import local settings, if on dev, 
    # import everything in local_Settings, which overrides the dj_database_url
    # If on deploy, local_settings won't be found so just ignore the ImportError
    try:
        from .local_settings import *
    except ImportError:
        pass
    

    所以您的local_settings.py 应该在您的开发服务器中,而不是在 Heroku 应用程序中(您可以忽略它,将其添加到 .gitignore)。我希望这是可以理解的。

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2016-01-27
      • 2016-08-12
      • 2013-01-10
      • 1970-01-01
      • 2014-05-28
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多