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

时间:2008-09-17 22:16:44

标签: python django

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

如何管理所有这些更改以进行部署 简单,自动化的流程?

14 个答案:

答案 0 :(得分:85)

更新: 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()查找正在运行的计算机的主机名,然后在列表中查找该主机名,并根据找到主机名的列表加载第二个设置文件。< / p>

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

查看示例here

答案 1 :(得分:26)

就个人而言,我为项目使用了一个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/'

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

答案 2 :(得分:23)

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

try:
    from settings_local import *
except ImportError:
    pass

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

答案 3 :(得分:11)

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

答案 4 :(得分:7)

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

1)使用默认的 settings.py 进行本地开发,2) 从:

开始创建 production-settings.py
import os
from settings import *

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

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:1)

我在外部目录中有我的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,这是非常危险的。

答案 8 :(得分:1)

好吧,我使用这个配置:

在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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我使用环境:

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

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

答案 11 :(得分:0)

这么多复杂的答案!

每个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

答案 12 :(得分:0)

为什么要把事情搞得这么复杂?我从 PHP/Laravel 背景进入 Django。我使用 .env,您可以轻松配置它。

安装这个包

django-environ

现在,在您拥有 settings.py 的文件夹中,创建一个文件 .env(确保将此文件放在 gitignore 中)

.env 文件中,放置环境变量,如调试设置状态、密钥、邮件凭据等 示例 .env

的快照
SECRET_KEY="django-insecure-zy%)s5$=aql=#ox54lzfjyyx!&uv1-q0kp^54p(^251&_df75i"

DB_NAME=bugfree
DB_USER=postgres
DB_PASSWORD=koushik
DB_PORT=5433
DB_HOST=localhost

APP_DEBUG=True # everything is string here

在设置中,确保使用这个实例化它

import environ
env = environ.Env()
environ.Env.read_env()

现在您可以从 .env 文件导入值并将它们放在您想要的任何位置。 settings.py

中的一些示例
SECRET_KEY = env('SECRET_KEY')
DEBUG = bool(env('APP_DEBUG', False))

你也可以这样设置默认值

env('DB_NAME', 'default value here')

提示 您可以在您拥有 .env.example 文件的同一文件夹中创建另一个 .env,您可以拥有 .env 模板,并且您可以提交 .example 文件。它有助于未来的开发人员轻松了解那里的环境变量。 .env.example 应该是这样的

SECRET_KEY=VALUE_HERE

DB_NAME=VALUE_HERE
DB_USER=VALUE_HERE
DB_PASSWORD=VALUE_HERE
DB_PORT=VALUE_HERE
DB_HOST=VALUE_HERE

EMAIL_HOST=VALUE_HERE
EMAIL_PORT=VALUE_HERE
EMAIL_HOST_USER=VALUE_HERE
EMAIL_HOST_PASSWORD=VALUE_HERE
DEFAULT_FROM_EMAIL=VALUE_HERE

答案 13 :(得分:-2)

事实上,您应该考虑为开发和生产环境提供相同(或几乎相同)的配置。否则,“嘿,它在我的机器上工作”的情况会不时发生。

因此,为了自动部署并消除WOMM问题,请使用Docker