Django:如何pipe理开发和生产环境?

我一直在开发一个基本的应用程序。 现在在部署阶段,我已经清楚我需要一个本地设置和生产设置。

知道以下内容将是非常好的:

  • 如何最好地处理开发和生产设置。
  • 如何仅在开发环境中保留诸如django-debug-toolbar之类的应用程序。
  • 任何其他提示和开发和部署设置的最佳做法。

我最喜欢的做法是使用DJANGO_SETTINGS_MODULE环境variables并使用两个(或更多)设置文件,例如production_settings.pytest_settings.py

然后,您可以使用引导脚本或进程pipe理器加载正确的设置(通过设置环境)。 如果你使用的是virtualenv,那么你甚至可以把它join到virtualenv的激活脚本中。

您可以利用PYTHONPATHvariables将设置存储在完全不同的位置(例如,在生产服务器上,将它们存储在/etc/ ) – 这样可以更轻松地部署,因为您完全将configuration与应用程序文件分开好东西)。

使用进程pipe理器设置DJANGO_SETTINGS_MODULE

如果你不喜欢编写一个设置环境的引导脚本(并且有很好的理由去感受这种方式!),我会build议使用一个进程pipe理器:

  • Supervisor允许您使用程序的environmentconfiguration密钥将环境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.pylocal.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 [...]