如何配置Django以进行简单的开发和部署?
我在做Django时倾向于使用SQLite
开发,但在实时服务器上,更强大的功能是
经常需要(例如MySQL / PostgreSQL)。
总是需要对Django进行其他更改
设置:不同的记录位置/强度,
媒体路径等
我们如何管理所有这些更改以使部署成为可能
简单,自动化的过程?
解决方案
更新:django-configurations已发布,对于大多数人来说,它可能比手动进行配置更好。
如果我们希望手动进行操作,则我先前的答案仍然适用:
我有多个设置文件。
- settings.local.py-特定于主机的配置,例如数据库名称,文件路径等。
- settings_development.py-用于开发的配置,例如DEBUG = True。
- settings_production.py-用于生产的配置,例如SERVER_EMAIL。
我将所有这些与" settings.py"文件绑定在一起,该文件首先导入" settings_local.py",然后再导入其他两个文件之一。它通过在settings_local.py,DEVELOPMENT_HOSTS和PRODUCTION_HOSTS中的两个设置来决定加载哪个。 settings.py调用platform.node()查找正在运行的计算机的主机名,然后在列表中查找该主机名,并根据在哪个列表中找到该主机名加载第二个设置文件。 。
这样,我们真正需要担心的唯一事情就是使settings_local.py
文件与主机特定的配置保持最新,并且其他所有内容都会自动处理。
在此处查看示例。
我有两个文件。 " settings_base.py",包含常用/默认设置,并已检查到源代码管理中。每个部署都有一个单独的settings.py
,它会在开始时从settings_base import *执行,然后根据需要进行覆盖。
除了Jim提到的多个设置文件外,我还倾向于将两个设置放到我的settings.py文件中,在顶部的BASE_DIR和BASE_URL设置为代码的路径,URL指向站点的底部。 ,所有其他设置都会被修改以将其自身添加到这些设置。
BASE_DIR =" / home / sean / myapp /"
例如MEDIA_ROOT ="%smedia /"%BASEDIR
因此,在移动项目时,我只需要编辑这些设置,而无需搜索整个文件。
我还建议我们查看一下能够促进远程部署自动化的结构和Capistrano(Ruby工具,但是它可以用于部署Django应用程序)。
就个人而言,我为该项目使用单个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/'
等等。可读性稍差,但是可以正常工作,省去了处理多个设置文件的麻烦。
在settings.py的结尾,我有以下内容:
try: from settings_local import * except ImportError: pass
这样,如果我想覆盖默认设置,则只需将settings_local.py放在settings.py旁边。
我认为这取决于站点的大小,是否需要逐步停止使用SQLite,我已经在几个较小的实时站点上成功使用了SQLite,并且运行良好。
我的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)使用默认的settings.py进行本地开发,以及2)
创建一个production-settings.py,开始于:
import os from settings import *
然后只需覆盖生产中不同的设置:
DEBUG = False TEMPLATE_DEBUG = DEBUG DATABASES = { 'default': { .... } }