在Django中同时使用多个配置文件的方法


Posted in Python onJuly 22, 2015

我们仅仅处理一个单一的设置文件 settings.py文件由django-admin.py startproject命令生成。但是当你准备要进行配置的时候,你将发现你需要多个配置文件以使你的开发环境和产品环境相独立。 比如,你可能不想每次在本地机器上测试代码改变的时候将DEBUG从False 改为True。Django通过使用多个配置文件而使得这种情况很容易得到避免。

如果你想把你的配置文件按照产品设置和开发设置组织起来,你可以通过下面三种方法的其中一种达到这个目的。

  •     设置成两个全面的,彼此独立的配置文件
  •     设置一个基本的配置文件(比如,为了开发)和第二个(为了产品)配置文件,第二个配置文件仅仅从基本的那个配置文件导入配置,并对需要定义的进行复写.
  •     使用一个单独的配置文件,此配置文件包含一个Python的逻辑判断根据上下文环境改变设置。

我们将会在依次解释这几种方式

首先,最基本的方法是定义两个单独的配置文件。 如果你是跟随之前的例子做下来的,那么你已经有了一个settings.py了,现在你只需要将它复制一份并命名为settings_production.py(文件名可以按照你自己的喜好定义),在这个新文件中改变DEBUG等设置。

第二种方法比较类似,但是减少了许多冗余。 作为使用两个内容大部分相同的配置文件的替代方式,你可以使用一个文件为基本文件,另外一个文件从基本文件中导入相关设定。 例如

# settings.py

DEBUG = True
TEMPLATE_DEBUG = DEBUG

DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME = 'devdb'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_PORT = ''

# ...

# settings_production.py

from settings import *

DEBUG = TEMPLATE_DEBUG = False
DATABASE_NAME = 'production'
DATABASE_USER = 'app'
DATABASE_PASSWORD = 'letmein'

此处,settings_production.py 从settings.py 导入所有的设定,仅仅只是重新定义了产品模式下需要特殊处理的设置。 在这个案例中,DEBUG 被设置为False,但是我们已经对产品模式设置了不同的数据库访问参数。 (后者将向你演示你可以重新定义 任何 设置,并不只是象 DEBUG 这样的基本设置。)

最终,最精简的达到两个配置环境设定的方案是使用一个配置文件,在此配置文件中根据不同的环境进行设置。 一个达到这个目的的方法是检查当前的主机名。 例如:

# settings.py

import socket

if socket.gethostname() == 'my-laptop':
  DEBUG = TEMPLATE_DEBUG = True
else:
  DEBUG = TEMPLATE_DEBUG = False

# ...

在这里,我们从python标准库导入了socket 模块,使用它来检查当前系统的主机名。 我们可以通过检查主机名来确认代码是否运行在产品服务器上。

一个关键是配置文件仅仅是包含python代码的文件。你可以从其他文件导入这些python代码,可以通过这些代码执行任意的逻辑判断等操作。 如果你打算按照这种方案走下去,请确定这些配置文件中的代码是足够安全(防弹)的。 如果这个配置文件抛出任何的异常,Django都有可能会发生很严重的崩溃。

重命名settings.py

随便将你的settings.py重命名为settings_dev.py或settings/dev.py或foobar.py,Django 并不在乎你的配置文件取什么名字,只要你告诉它你使用的哪个配置文件就可以了。

但是如果你真的重命名了由django-admin.py startproject 命令创建的settings.py文件,你会发现manage.py会给出一个错误信息说找不到配置文件。 那是由于它尝试从这个文件中导入一个叫做settings的模块,你可以通过修改manage.py 文件,将 import settings 语句改为导入你自己的模块,或者使用django-admin.py而不是使用manage.py,在后一种方式中你需要设置 DJANGO_SETTINGS_MODULE 环境变量为你的配置文件所在的python 路径.(比如'mysite.settings')。
DJANGO_SETTINGS_MODULE

通过这种方式的代码改变后,本章的下一部分将集中在对具体环境(比如Apache)的发布所需要的指令上。 这些指令针对每一种环境都不同,但是有一件事情是相同的。 在每一种环境中,你都需要告诉Web服务器你的DJANGO_SETTINGS_MODULE是什么,这是你的Django应用程序的进入点。 DJANGO_SETTINGS_MODULE指向你的配置文件,在你的配置文件中指向你的ROOT_URLCONF,在ROOT_URLCONF中指向了你的视图以及其他的部分。

DJANGO_SETTINGS_MODULE是你的配置文件的python的路径 比如,假设mysite是在你的Python路径中,DJANGO_SETTINGS_MODULE对于我们正在进行的例子就是'mysite.settings'。

Python 相关文章推荐
简明 Python 基础学习教程
Feb 08 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
Python实现的凯撒密码算法示例
Apr 12 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
Python如何使用turtle库绘制图形
Feb 26 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
django中related_name的用法说明
May 20 Python
Python 实现将某一列设置为str类型
Jul 14 Python
python3中编码获取网页的实例方法
Nov 16 Python
Pytorch之扩充tensor的操作
Mar 04 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
在Python的Django框架中编写错误提示页面
Jul 22 #Python
详解Django通用视图中的函数包装
Jul 21 #Python
在Python的Django框架中显示对象子集的方法
Jul 21 #Python
在Django的通用视图中处理Context的方法
Jul 21 #Python
Django框架中的对象列表视图使用示例
Jul 21 #Python
在Python的Django框架中使用通用视图的方法
Jul 21 #Python
在Django的模型中执行原始SQL查询的方法
Jul 21 #Python
You might like
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
JS实现前端动态分页码代码实例
2020/06/02 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
python tornado修改log输出方式
2019/11/18 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
PyTorch-GPU加速实例
2020/06/23 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
Python字符串及文本模式方法详解
2020/09/10 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
护士自我评价范文
2014/01/25 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
小学生元旦感言
2014/02/26 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
小学科学教学计划
2015/01/21 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Golang流模式之grpc的四种数据流
2022/04/13 Golang