Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值

Posted

技术标签:

【中文标题】Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值【英文标题】:Django with Postgresql on Heroku - settings.DATABASES is improperly configured. Please supply the NAME value 【发布时间】:2017-12-17 14:15:33 【问题描述】:

我使用 Angular 4 前端、Django 后端和 Postgresql 数据库在 Docker 中的 Heroku 上部署了我的项目。此时我的文件如下所示。当我打开应用程序时出现错误:

2017-07-11T19:51:14.485577+00:00 app[web.1]:     self.connect()
2017-07-11T19:51:14.485577+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__
2017-07-11T19:51:14.485578+00:00 app[web.1]:     six.reraise(dj_exc_type, dj_exc_value, traceback)
2017-07-11T19:51:14.485578+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
2017-07-11T19:51:14.485578+00:00 app[web.1]:     raise value.with_traceback(tb)
2017-07-11T19:51:14.485579+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py", line 213, in ensure_connection
2017-07-11T19:51:14.485579+00:00 app[web.1]:     self.connect()
2017-07-11T19:51:14.485579+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py", line 189, in connect
2017-07-11T19:51:14.485580+00:00 app[web.1]:     self.connection = self.get_new_connection(conn_params)
2017-07-11T19:51:14.485580+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 176, in get_new_connection
2017-07-11T19:51:14.485580+00:00 app[web.1]:     connection = Database.connect(**conn_params)
2017-07-11T19:51:14.485581+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
2017-07-11T19:51:14.485581+00:00 app[web.1]:     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
2017-07-11T19:51:14.485582+00:00 app[web.1]: django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known

在本地,一切似乎都运行正常。我使用docker exec -ti name /bin/bash 然后python path\manage.py migrate 并添加数据库。

也许我在 Heroku 上的数据库迁移有问题?

过程文件:

web: sh -c 'cd PROJECT/backend/project && gunicorn project.wsgi --log-file -'

项目树:

DockerProject
      ├── Dockerfile
      ├── Procfile
      ├── init.sql
      ├── requirements.txt
      ├── docker-compose.yml
      └── PROJECT
            ├── frontend
                   └── all files
            └── backend
                  └── project
                        ├── prices
                        ├── manage.py
                        └── project
                              └── all backend files

前端的 Dockerfile:

# Create image based on the official Node 6 image from dockerhub
FROM node:6

# Create a directory where our app will be placed
RUN mkdir -p /usr/src/app

# Change directory so that our commands run inside this new directory
WORKDIR /usr/src/app

# Copy dependency definitions
COPY package.json /usr/src/app

# Install dependecies
RUN npm install

# Get all the code needed to run the app
COPY . /usr/src/app

# Expose the port the app runs in
EXPOSE 4200

# Serve the app
CMD ["npm", "start"]

主目录的 Dockerfile:

FROM python:3.6.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/

docker-compose.yml:

version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: aso
      POSTGRES_PASSWORD: somepass
  django:
    build: .
    command: python3 MainDirectory/backend/myProject/manage.py runserver 0.0.0.0:8001
    volumes:
      - .:/code
    ports:
      - "8001:8001"
    depends_on:
      - db
  angular:
    build: MainDirectory/frontend
    ports:
      - "4200:4200"
    depends_on:
      - django

init.sql:

CREATE USER myUser;
CREATE DATABASE myProject;
GRANT ALL PRIVILEGES ON DATABASE myProject TO myUser;

更新

我的项目(包括 postgresql 数据库)在此设置下正常工作。然而,正如我所提到的,Heroku 存在问题。

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'aso',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    

基于on this topic 我将数据库设置更改为

DATABASES = 'default': dj_database_url.config(default='postgres://localhost')

不幸的是,我得到:

ImproperlyConfigured at /
settings.DATABASES is improperly configured. Please supply the NAME value.

有什么建议吗?

【问题讨论】:

您在该数据库上创建了超级用户?你也知道那是一个本地数据库。如果您想要 Heroku 应用正在使用的那个,您必须更改 ENGINE 参数。 本地我得到同样的错误。我不明白 django 必须如何连接到数据库,因为没有像以前版本的设置中定义的参数? 您是否为该 Postgres 创建了超级用户?请回答问题。如果你想在本地运行 PSQL,你必须下载它并运行一个服务器。这些都是你做的? @hansTheFranz 我更新了我的帖子。旧设置数据库在本地正常工作。 【参考方案1】:

我想帮助你,我在这里给你你可以改变的东西,但我不能保证任何事情。我知道您现在正在尝试很长时间才能使该应用程序运行。

让它在本地运行

将数据库更改为以下内容:

DATABASES = 
 "default": 
 
  "ENGINE": "django.db.backends.postgresql_psycopg2", #one of those should work
  'ENGINE': 'django.db.backends.postgresql',   #one of those should work
  "NAME": 'myProject',
  "HOST": "localhost", 
  "PORT": "5432",
 
 

当然只选择一个引擎并将另一个注释掉。

您也可以尝试通过PSequel 等桌面应用程序访问您的数据库,您可以使用给定的参数登录您的数据库。

直接取Heroku DB

Heroku 在您初始化项目时提供一个数据库。你应该有一个 Postgres 附加组件。转到该链接“https://dashboard.heroku.com/apps/YourAppName/settings”(Heroku.com 上您的应用程序的设置页面),然后点击旁边的按钮“配置变量”。应该会弹出一个带有DATABASE_URL 的字段,并以postgres://fasdfsdafsadfdsafsdafsda:123123132132123asdfdsafdssafdsfdaasdfsadf2-321-21-312-321.casdte-1.amazonaws.com:5432/adsdasdasads123 的格式复制它旁边的链接 笔记!切勿将该链接提供给任何人!

现在你可以在你的 settings.py 中使用了

  import dj_database_url 
  DATABASES = 'default': dj_database_url.parse('postgres://the-just-copied-link-comes-here

在你的 settings.py 中,你就有了项目中的 Heroku 数据库。它的开发速度非常慢,但是当您将代码推送到 Heroku 时,您需要以这种方式发送它。如果没有,不要忘记安装 dj_database_url。 Package

我希望这能让您离目标更近一步。

在 settings.py 中

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
MAILER_LIST = ['yourMail@gmail.com']
EMAIL_HOST = ' smtp.gmail.com'
EMAIL_HOST_USER = 'Name'
EMAIL_HOST_PASSWORD = 'lalalala'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'root@localhost'
ADMINS = [("Name", 'Mail@gmail.com')]
LOGGING = 
     'version': 1,
     'disable_existing_loggers': False,
     'handlers': 
         'mail_admins': 
             'level': 'ERROR',
             'class': 'django.utils.log.AdminEmailHandler' ,
     'loggers': 'django.request': 
             'handlers': ['mail_admins'],
             'level': 'ERROR',
             'propagate': True, ,

您现在也不必这样做,但这样您就可以在日志记录部分看到您在 heroku 上遇到的错误。在那里你有回溯并且可以弄清楚为什么你的前端不工作(现在我猜测它是一个带有一些静态文件的 404)。在你写下一个问题时告诉我 ;) 从你的 heroku 应用程序获取日志https://dashboard.heroku.com/apps/YourAppName/logs

【讨论】:

当我单击Config Variables 旁边的按钮Reveal Config Vars 时,我得到There are no config vars for this app yet。没有DATABASE_URL heroku addons:create heroku-postgresql:hobby-dev 把它放在终端里。比你拥有它。没有服务器,您无法在 Internet 上拥有可供所有人查看的站点。 我想我只是像你写的那样向前迈了一步。但是还有一个问题:)LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...缺乏迁移? 当您想要添加真正的 Postgres Heroku 数据库时,您需要进行迁移并再次迁移并创建用户。无论如何,你需要做所有这些,但我有点害怕在旧问题没有解决之前提出一个新问题。当你尝试我的本地设置时发生了什么?无法连接? 我不确定发生了什么。当我open app 我的前端不工作。但是例如,当我执行https://myapp.herokuapp.com/admin 时,我看到 Django 管理面板但日志错误,我得到Please enter the correct username and password for a staff account. Note that both fields may be case-sensitive. 本地一切似乎都正常工作。但是我之前有数据的数据库,此时Django创建了一个新的,但看起来还可以。【参考方案2】:

我遇到了类似的问题,并且能够使用以下过程将 django 应用程序部署到 heroku:

    我在我的项目目录中created a new heroku app 并推送了代码。 此时,heroku 检测到我的应用程序是使用 postgres 的 django 应用程序,因此它自动添加了postgres addon。如果您的应用不这样做,您可以手动add the heroku postgresql addon。 现在,关键步骤是从heroku 的postgres 实例中获取配置信息,并将其添加到django 应用程序中的settings.py 文件中。为此,请转到 https://dashboard.heroku.com/apps//resources 。 “Heroku Postgres :: Database”应该列在“附加组件”部分下。点击那个。 这会将您带到“Heroku Postgresql”插件的页面。单击“设置”选项卡。单击“查看凭据...”。这将打开一个带有配置的屏幕。关于 postgres 实例的信息。 将这些值(如主机、用户、端口、密码等)复制到您的 django 应用程序的 settings.py 文件中,并将其推送到 heroku。 特别是针对您的问题,本节中的“数据库”条目提供了数据库的名称。 祈祷吧,希望一切顺利!

如here 所述,这一切都可以通过 CLI 以编程方式完成。

【讨论】:

以上是关于Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 共享 PostgreSQL 和 pgcrypto

Heroku:执行查询但没有 postgresql 日志

在heroku上部署spring boot应用程序的问题

为 Heroku 重写 PostgreSQL 查询

无法连接到服务器:PostgreSQL -Heroku

Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db