如何在Django中管理本地与生产设置?

2024-04-29 08:55:52 发布

您现在位置: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

.
└── 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. 这很简单。没有重新导入的黑客

settings.py中:

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

您可以覆盖local_settings.py中需要的内容;那么它应该不受您的版本控制。但既然你提到了复制,我猜你没有使用;)

相关问题 更多 >