【问题标题】:production settings for django projectdjango 项目的生产设置
【发布时间】:2013-01-05 08:03:09
【问题描述】:

我创建了一个production_settings.py,在其中放置了所有生产环境变量和值,例如:

import dj_database_url
DATABASES['default'] =  dj_database_url.config()

我想我会声明一个像

这样的环境变量

MYPROJECT_PRODUCTION

然后像这样设置

heroku config:add MYPROJECT_PRODUCTION=Trueexport MYPROJECT_PRODUCTION=True

在settings.py(这是django默认创建的)中,我想我会在文件末尾添加

import os
if os.environ.has_key('MYPROJECT_PRODUCTION') and os.environ.get('MYPROJECT_PRODUCTION')=='True':
    from production_settings import *

这是正确的做法吗?

我在尝试python manage shell时遇到导入错误

export DJANGO_SETTINGS_MODULE='myproject.settings'
export MYPROJECT_PRODUCTION=True
me@ubuntu:~/dev/python/django/myproject$ python manage.py shell
Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)

manage.py 与settings.py 存在于同一文件夹中..仍然出现错误。

我检查了echo $MYPROJECT_PRODUCTION 输出True

【问题讨论】:

  • 添加了 Heroku 标签,因为对我来说你的解决方案看起来不错,也许其他人在 heroku 上使用 django 可以回答你的问题。
  • 你能打印出你的应用的目录结构吗

标签: python django heroku production


【解决方案1】:

就个人而言,我将我的生产设置保存在 settings.py 中,然后包含一个 local_settings.py 文件(使用 .hgignore 将其排除在修订控制之外)。

我将以下内容添加到 settings.py 的末尾

try:
    from local_settings import *
except ImportError, e:
    pass

然后在我的 local_settings.py 中覆盖适当的设置 -

DEBUG = True

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'tag',
        'USER': 'tag',
        'PASSWORD': 'tag',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

我的印象是这是一个相当好用的方法(我从同事那里学来的,但我也看到过它的博客)

编辑

作为对 balazs 非常好的观点的回应,您可能会在此方法上添加一个变体,以保护敏感数据的私密性。在 local_settings 导入之后可能包括以下内容 -

try:
    from production_settings import *
except ImportError, e:
    pass

然后从版本控制中排除production_settings.py。我想您可能需要使用不同的方法来部署production_settings.py,但我认为这没什么大不了的。

【讨论】:

  • @damon 使用的也是一种常用方法。我认为这更好,因为如果您使用版本控制服务器设置(包含所有敏感密码、密钥等)文件将不会转到存储库,如果它是公共存储库,这是一个好主意,或者您不是唯一在此站点上工作的人。
【解决方案2】:

我建议不要为不同的环境使用不同的设置文件,而应使用环境变量自定义设置。这允许您默认使用本地开发设置并在生产中覆盖它。

例如数据库和静态/媒体根设置

# Default database URL is a local SQLite instance
DATABASE_URL = 'sqlite:///%s' % os.path.join(os.path.dirname(__file__), 'db.sqlite')

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

MEDIA_ROOT = os.environ.get('MEDIA_ROOT',
                            os.path.join(os.path.dirname(__file__), 'media'))

MEDIA_URL = os.environ.get('MEDIA_URL', '/media/')


STATIC_ROOT = os.environ.get('STATIC_ROOT',
                             os.path.join(os.path.dirname(__file__), 'static'))

STATIC_URL = os.environ.get('STATIC_URL', '/static/')

这允许您通过heroku config:set 在 Heroku 上设置任何设置,并消除处理多个设置文件的复杂性,例如:

heroku config:set MEDIA_URL=http://custom-media-server.com/media/
heroku config:set STATIC_URL=http://custom-media-server.com/static/

我还创建了一个自定义Django project template,它可以从环境变量中获取大多数设置。

您还应该查看12 Factor Application 网站,特别是如何查看store configuration

【讨论】:

    【解决方案3】:

    您是否将 DATABASES 定义为字典?作者:

    DATABASES = {}
    

    同时显示您的heroku logs

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2019-01-11
      • 1970-01-01
      • 2021-09-12
      • 2012-06-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多