Django:如何pipe理开发和生产环境?
我一直在开发一个基本的应用程序。 现在在部署阶段,我已经清楚我需要一个本地设置和生产设置。
知道以下内容将是非常好的:
- 如何最好地处理开发和生产设置。
- 如何仅在开发环境中保留诸如django-debug-toolbar之类的应用程序。
- 任何其他提示和开发和部署设置的最佳做法。
我最喜欢的做法是使用DJANGO_SETTINGS_MODULE
环境variables并使用两个(或更多)设置文件,例如production_settings.py
和test_settings.py
。
然后,您可以使用引导脚本或进程pipe理器加载正确的设置(通过设置环境)。 如果你使用的是virtualenv,那么你甚至可以把它join到virtualenv的激活脚本中。
您可以利用PYTHONPATH
variables将设置存储在完全不同的位置(例如,在生产服务器上,将它们存储在/etc/
) – 这样可以更轻松地部署,因为您完全将configuration与应用程序文件分开好东西)。
使用进程pipe理器设置DJANGO_SETTINGS_MODULE
如果你不喜欢编写一个设置环境的引导脚本(并且有很好的理由去感受这种方式!),我会build议使用一个进程pipe理器:
- Supervisor允许您使用程序的
environment
configuration密钥将环境variables传递到托pipe进程。 - Honcho (Ruby的Foreman的纯Python等价物)允许您在“环境”(
.env
)文件中定义环境variables。
黑客入侵bin/activate
设置DJANGO_SETTINGS_MODULE
如果使用virtualenv,则将其附加到bin/activate
脚本中:
DJANGO_SETTINGS_MODULE="production_settings" export DJANGO_SETTINGS_MODULE
并在您的testing服务器上:
DJANGO_SETTINGS_MODULE="test_settings" export DJANGO_SETTINGS_MODULE
我通常每个环境都有一个设置文件和一个共享的设置文件:
/myproject/ settings.production.py settings.development.py shared_settings.py
我的每个环境文件都有:
try: from shared_settings import * except ImportError: pass
这使我可以在必要时覆盖共享设置(通过在该节以下添加修改)。
然后通过链接到settings.py来select要使用的设置文件:
ln -s settings.development.py settings.py
默认情况下使用生产设置,但在settings.py
文件所在的文件夹中创build一个名为settings_dev.py
的文件。 在那里添加覆盖,例如DEBUG=True
。
在将用于开发的计算机上,将其添加到~/.bashrc
文件中:
export DJANGO_DEVELOPMENT=true
在settings.py
文件的底部添加以下内容。
# Override production variables if DJANGO_DEVELOPMENT env variable is set if os.environ.get('DJANGO_DEVELOPMENT') is not None: from settings_dev import *
(请注意,导入*
通常应该避免在Python中,但这是一个独特的情况)
默认情况下,生产服务器不会覆盖任何东西。 完成!
与其他答案相比,这个更简单,因为它不需要更新PYTHONPATH
,或者设置DJANGO_SETTINGS_MODULE
,它只允许您一次在一个django项目上工作。
创build多个settings*.py
文件,根据环境推断需要更改的variables。 然后在你的主settings.py
文件的最后:
try: from settings_dev import * except ImportError: pass
您为每个阶段保留单独的settings_*
文件。
在settings_dev.py
文件的顶部,添加以下内容:
import sys globals().update(vars(sys.modules['settings']))
导入需要修改的variables。
这个wiki条目有更多关于如何分割你的设置的想法。
我使用真棒djangoconfiguration ,并且所有设置都存储在我的settings.py
:
from configurations import Configuration class Base(Configuration): # all the base settings here... BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ... class Develop(Base): # development settings here... DEBUG = True ... class Production(Base): # production settings here... DEBUG = False
要configurationDjango项目,我只是按照文档 。
如果您想保留1个设置文件,并且您的开发操作系统与您的生产操作系统不同,则可以将其置于settings.py的底部:
from sys import platform if platform == "linux" or platform == "linux2": # linux # some special setting here for when I'm on my prod server elif platform == "darwin": # OS X # some special setting here for when I'm developing on my mac elif platform == "win32": # Windows... # some special setting here for when I'm developing on my pc
阅读更多: 如何在Python中检查操作系统?
大厦closurescs01的答案:
如果你的环境variables有问题,请将其值设置为一个string(例如,我做了DJANGO_DEVELOPMENT="true"
)。
我还改变了cs01的文件工作stream程如下:
#settings.py import os if os.environ.get('DJANGO_DEVELOPMENT') is not None: from settings_dev import * else: from settings_production import * #settings_dev.py development settings go here #settings_production.py production settings go here
这样,Django在运行适当的设置文件之前不必读取整个设置文件。 如果您的生产文件只需要生产服务器上的东西,那么这个解决scheme就派上用场了。
注意:在Python 3中,导入的文件需要有一个.
附加(例如from .settings_dev import *
)
这似乎已经回答了,但是我使用的方法与版本控制结合使用如下:
在同样的目录下设置一个env.py文件,作为本地开发环境的设置,我也将其添加到.gitignore中:
env.py:
#!usr/bin/python DJANGO_ENV = True ALLOWED_HOSTS = ['127.0.0.1', 'dev.mywebsite.com']
的.gitignore:
mywebsite/env.py
settings.py:
if os.path.exists(os.getcwd() + '/env.py'): #env.py is excluded using the .gitignore file - when moving to production we can automatically set debug mode to off: from env import * else: DJANGO_ENV = False DEBUG = DJANGO_ENV
我只是发现这个工程,更优雅 – 与env.py很容易看到我们的本地环境variables,我们可以处理所有这一切,没有多个settings.py文件或喜欢。 这种方法允许使用我们不想在生产服务器上设置的各种本地环境variables。 通过版本控制利用.gitignore,我们也保持了一切无缝集成。
我使用注意文件结构:
project/ ... settings/ settings/common.py settings/local.py settings/prod.py settings/__init__.py -> local.py
所以__init__.py
是一个链接(在Unix或mklink在Windows中的ln)到local.py
或可以是prod.py
所以configuration仍然在project.settings
模块是干净和有组织的,如果你想使用如果您需要为生产环境运行命令,则可以使用环境variablesDJANGO_SETTINGS_MODULE
来指定project.settings.prod
。
在文件prod.py
和local.py
:
from .shared import * DATABASE = { ... }
并且shared.py
文件保持为全局的而没有特定的configuration。
这是我的解决scheme,具有不同的dev,test和prod环境
import socket [...] DEV_PC = 'PC059' host_name = socket.gethostname() if host_name == DEV_PC: #do something pass elif [...]