如何管理Django中的本地和生产设置?

2024-04-29 15:01:30 发布

您现在位置:Python中文网/ 问答频道 /正文

建议如何处理本地开发和生产服务器的设置?其中一些(如常量等)可以在两者中更改/访问,但其中一些(如静态文件的路径)需要保持不同,因此不应在每次部署新代码时都被覆盖。

目前,我正在将所有常量添加到settings.py。但每次我在本地更改某个常量时,我都必须将其复制到生产服务器并编辑用于生产特定更改的文件。。。:(一)

编辑:看起来这个问题没有标准答案,我接受了最流行的方法。


Tags: 文件方法代码py路径服务器编辑settings
3条回答

Two Scoops of Django: Best Practices for Django 1.5建议对设置文件使用版本控制并将文件存储在单独的目录中:

project/
    app1/
    app2/
    project/
        __init__.py
        settings/
            __init__.py
            base.py
            local.py
            production.py
    manage.py

base.py文件包含常见设置(例如媒体根或管理),而local.pyproduction.py具有特定于站点的设置:

在基文件settings/base.py中:

INSTALLED_APPS = (
    # common apps...
)

在本地开发设置文件settings/local.py中:

from project.settings.base import *

DEBUG = True
INSTALLED_APPS += (
    'debug_toolbar', # and other apps for local development
)

在文件生产设置文件settings/production.py中:

from project.settings.base import *

DEBUG = False
INSTALLED_APPS += (
    # other apps for production site
)

然后在运行django时,添加--settings选项:

# Running django for local development
$ ./manage.py runserver 0:8000 --settings=project.settings.local

# Running django shell on the production site
$ ./manage.py shell --settings=project.settings.production

这本书的作者也在Github上发布了a sample project layout template

settings.py中:

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

您可以重写local_settings.py中所需的内容;它应该不在您的版本控制范围内。但既然你提到抄袭,我猜你什么也不用;)

使用以下布局而不是settings.py

.
└── settings/
    ├── __init__.py  <= not versioned
    ├── common.py
    ├── dev.py
    └── prod.py

common.py是大多数配置所在的位置。

prod.py从common导入所有内容,并覆盖需要覆盖的内容:

from __future__ import absolute_import # optional, but I like it
from .common import *

# Production overrides
DEBUG = False
#...

类似地,dev.pycommon.py导入所有内容,并覆盖它需要覆盖的任何内容。

最后,__init__.py是决定要加载哪些设置的地方,也是存储机密的地方(因此不应对该文件进行版本控制):

from __future__ import absolute_import
from .prod import *  # or .dev if you want dev

##### DJANGO SECRETS
SECRET_KEY = '(3gd6shenud@&57...'
DATABASES['default']['PASSWORD'] = 'f9kGH...'

##### OTHER SECRETS
AWS_SECRET_ACCESS_KEY = "h50fH..."

我喜欢这个解决方案是:

  1. 所有的东西都在你的版本控制系统中,除了秘密
  2. 大多数配置都在一个地方:common.py
  3. 产品特定的东西进入prod.py,开发特定的东西进入dev.py。很简单。
  4. 您可以重写prod.pydev.pycommon.py的内容,也可以重写__init__.py中的任何内容。
  5. 很简单的python。没有再进口黑客。

相关问题 更多 >