it-swarm.cn

如何配置Django进行简单的开发和部署?

我倾向于使用 SQLite 当做 Django 开发时,但在实时服务器上经常需要更强大的东西( MySQL / PostgreSQL ,例如)。不变的是,Django设置还有其他变化:不同的记录位置/强度,媒体路径等。

如何管理所有这些更改以使部署成为一个简单的自动化流程?

111
reppimp

更新: Django-configurations 已经发布,这对大多数人来说可能比手动更好。

如果您更愿意手动操作,我的早期答案仍然适用:

我有多个设置文件。

  • settings_local.py - 特定于主机的配置,例如数据库名称,文件路径等。
  • settings_development.py - 用于开发的配置,例如DEBUG = True
  • settings_production.py - 用于生产的配置,例如SERVER_EMAIL

我将这些与settings.py文件绑定在一起,该文件首先导入settings_local.py,然后导入另外两个中的一个。它决定在settings_local.py - DEVELOPMENT_HOSTSPRODUCTION_HOSTS中加载两个设置。 settings.py调用platform.node()查找运行它的机器的主机名,然后在列表中查找该主机名,并根据找到主机名的列表加载第二个设置文件。

这样,您真正需要担心的唯一事情是使settings_local.py文件与特定于主机的配置保持同步,并且其他所有内容都会自动处理。

看一个例子 这里

85
Jim

就个人而言,我使用单个settings.py进行项目,我只是让它查找它所在的主机名(我的开发机器的主机名以“gabriel”开头,所以我只有这个:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

然后在其他部分我有这样的事情:

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

等等。可读性稍差,但它工作正常,节省了不得不兼顾多个设置文件。

26
Gabriel Ross

在settings.py结束时,我有以下内容:

try:
    from settings_local import *
except ImportError:
    pass

这样,如果我想覆盖默认设置,我需要将settings_local.py放在settings.py旁边。

23
Dmitry Shevchenko

我有两个文件。 settings_base.py,包含常用/默认设置,并检入源代码管理。每个部署都有一个单独的settings.py,它在开头执行from settings_base import *,然后根据需要覆盖。

11
John Millikin

我找到的最简单的方法是:

1)使用默认的 settings.py 进行本地开发,2)创建 production-settings.py 从以下开始:

import os
from settings import *

然后只需覆盖生产中不同的设置:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
7
Andre Bossard

有点相关,对于使用多个数据库部署Django本身的问题,您可能需要查看 Djangostack 。您可以下载一个完全免费的安装程序,允许您安装Apache,Python,Django等。作为安装过程的一部分,我们允许您选择要使用的数据库(MySQL,SQLite,PostgreSQL)。在内部自动部署时,我们会广泛使用安装程序(它们可以在无人参与模式下运行)。

2
Josue

我在外部目录中有我的settings.py文件。这样,它不会被检入源代码控制,也不会被部署覆盖。我把它放在我的Django项目下的settings.py文件中,以及任何默认设置:

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

注意:如果你不能信任local_settings.py,这是非常危险的。

1
Chase Seibert

好吧,我使用这个配置:

在settings.py结束时:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

在locale_settings.py中:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
1
sacabuche

除了Jim提到的多个设置文件之外,我还倾向于将两个设置放在我的settings.py文件中,顶部BASE_DIRBASE_URL设置为代码路径和URL到站点基础,所有其他设置被修改以适应这些。

BASE_DIR = "/home/sean/myapp/"例如MEDIA_ROOT = "%smedia/" % BASEDIR

因此,在移动项目时,我只需要编辑这些设置,而不是搜索整个文件。

我还建议查看fabric和 Capistrano (Ruby工具,但它可用于部署Django应用程序),这有助于远程部署的自动化。

1
Sean O Donnell

这是一个较旧的帖子,但我想如果我添加这个有用的library它会简化一些事情。

使用 Django配置

快速开始

pip install Django-configurations

然后在项目的settings.py或用于存储设置常量的任何其他模块中继承包含的configurations.Configuration类,例如:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Django_CONFIGURATION环境变量设置为您刚刚创建的类的名称,例如在~/.bashrc中:

export Django_CONFIGURATION=Dev

和往常一样的模块导入路径的Django_SETTINGS_MODULE环境变量,例如:在bash中:

export Django_SETTINGS_MODULE=mysite.settings

或者在Django的默认--configuration命令行选项中使用Django管理命令时提供--settings选项,例如:

python manage.py runserver --settings=mysite.settings --configuration=Dev

要使Django能够使用您的配置,您现在必须修改 manage.py wsgi.py script以使用Django-configurations的相应启动器功能版本,例如:一个典型的 manage.py 使用Django配置看起来像这样:

#!/usr/bin/env python

import os
import sys

if __== "__main__":
    os.environ.setdefault('Django_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('Django_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

请注意,在第10行中,我们不使用通用工具Django.core.management.execute_from_command_line而是使用configurations.management.execute_from_command_line

这同样适用于你的 wsgi.py file,例如:

import os

os.environ.setdefault('Django_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('Django_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

这里我们不使用默认的Django.core.wsgi.get_wsgi_application函数,而是使用configurations.wsgi.get_wsgi_application

而已!您现在可以使用 manage.py 和您最喜欢的WSGI启用服务器来使用您的项目。

0
Little Phild

我认为这取决于网站的大小,你是否需要加强使用SQLite,我已经在几个较小的现场网站上成功使用了SQLite,并且运行良好。

0
Ycros

我用环境:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

我相信这是一种更好的方法,因为最终您需要为您的测试环境进行特殊设置,并且您可以轻松地将其添加到此条件中。

0
slashmili

这么多复杂的答案!

每个settings.py文件都附带:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

我使用该目录来设置这样的DEBUG变量(使用你的开发代码所在的directoy重新安装):

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

然后,每次移动settings.py文件时,DEBUG都将为False,这是您的生产环境。

每次需要不同于开发环境中的设置时,只需使用:

if(DEBUG):
    #Debug setting
else:
    #Release setting
0
JM Desrosiers