在Heroku上使用Postgresql的Django - settings.DATABASES配置不正确。请提供NAME值

时间:2017-07-13 00:53:58

标签: python django python-3.x docker heroku

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

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上迁移数据库时可能有问题吗?

Procfile:

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

Frontend的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/

搬运工-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.

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

我想帮助你,我会在这里给你什么,你可以改变它,但我不能保证任何事情。我知道你现在要花很长时间才能运行该应用程序。

  

让它运行本地

将DATABASES更改为以下内容:

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" (设置页面ob您在Heroku.com上的应用程序)并且您得到了重点" Config Variables"点击旁边的按钮。应该弹出一个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 DB。它的开发速度非常慢,但是当你将代码推送到Heroku时,你需要以这种方式发送它。如果没有dj_database_url,请不要忘记安装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

获取日志

答案 1 :(得分:0)

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

  1. 我项目目录中的created a new heroku app并推送了代码。
  2. 此时,heroku检测到我的应用程序是使用postgres的django应用程序,因此它会自动添加postgres addon。如果您的应用不这样做,您可以手动add the heroku postgresql addon
  3. 现在,关键步骤是从heroku的postgres实例获取配置信息,并将其添加到django应用程序中的settings.py文件中。为此,请转到https://dashboard.heroku.com/apps/ / resources。 “Heroku Postgres :: Database”应列在“附加组件”部分下。点击它。
  4. 这将带您进入“Heroku Postgresql”插件的页面。单击“设置”选项卡。单击“查看凭据...”。这将打开一个配置屏幕。关于postgres实例的信息。
  5. 将这些值(主机,用户,端口,密码等内容)复制到django应用程序的settings.py文件中,然后将其推送到heroku。 特别针对您的问题,本节中的“数据库”条目提供了数据库的名称。
  6. 交叉你的手指,希望最好!
  7. 正如here所述,这可以通过CLI以编程方式完成。