利用Django-environ如何区分不同环境


Posted in Python onAugust 26, 2018

介绍

Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django能够响应网页请求,还能让我们更轻松地读写数据库、管理用户等。本文主要介绍了关于利用Django-environ区分不同环境的相关内容,下面话不多说了,来一起看看详细的介绍吧

就是一个读取环境变量的东西

就2个类: Env/ Path.

基本用法

env.example文件

ALLOWED_HOSTS=www.example1.com,www.example2.com
DATABASE_URL='mysql://user:password@127.0.0.1:3306/dbname'
DEBUG=True
DJANGO_LOG_LEVEL='INFO'

ipython交互示例

>> import environ
>> env = environ.Env()
>> env.str('SHELL') # 读取环境变量SHELL
'/bin/zsh'
>> env.str('PATH')
'这里显示的是环境变量PATH的内容'
>> env.read_env('env.example') # 从文件读进来
>> env.str('DJANGO_LOG_LEVEL')
'INFO'
>> env.bool('DEBUG', False) # 可以设置默认值,如果获取不到,就取默认值
True
>> env.list('ALLOWED_HOSTS')
['www.example1.com', 'www.example2.com']
>> env.db_url('DATABASE_URL')
{'ENGINE': 'django.db.backends.mysql',
 'HOST': '127.0.0.1',
 'NAME': 'dbname',
 'PASSWORD': '#password',
 'PORT': 3306,
 'USER': 'user'}

>> ROOT_DIR = environ.Path('/home/mattkang/mysite/') # 还可以在settings.py中ROOT_DIR = environ.Path(__file__) - 2 。而不用os.path.dirname(os.path.dirname(os.path.abspath(__file__)))这么麻烦的拼接。
>> ROOT_DIR('static') # 而不用os.path.join(ROOT_DIR, 'static')
'/home/mattkang/mysite/static'
>> APPS_DIR = ROOT_DIR.path('project')

在我们项目中的使用

只用一个settings.py,而不是多个比如settings/dev.py、settings/prod.py、settings/qa.py。

只需要一个额外的的环境变量来读取不同环境的env文件以区分不同环境。这个环境变量就没法写在env文件了,必须手动指定。假设我们这个环境变量叫PROJECT_ENV。

那么我们在命令行执行任何命令的时候,在前面加上PROJECT_ENV=xxx来指定环境变量。

比如,之前是

python manage.py shell --settings=mysite.settings.dev

现在是

PROJECT_ENV=dev python manage.py shell

之前是

python manage.py runserver --settings=mysite.settings.dev

现在是

PROJECT_ENV=dev python manage.py runserver

当然,也可以export来指定这个环境变量,也可以修改shell配置文件来指定这个环境变量,甚至supervisord和uwsgi的配置文件也可以指定环境变量。

我们的settings.py里面是这样根据PROJECT_ENV来读取不同env文件的。

env = environ.Env()
env.read_env('envs/env.%s' % env.str('PROJECT_ENV', 'prod')) # 在envs文件夹下有env.dev/ env.prod/ env.qa/ env.local文件

DEBUG = env.bool('DEBUG', False)
SECRET_KEY = env.str('SECRET_KEY')
LOGGING = {
 'version': 1,
 'disable_existing_loggers': False,
 'handlers': {
  'console': {
   'class': 'logging.StreamHandler',
  },
 },
 'loggers': {
  'django': {
   'handlers': ['console'],
   'level': env.str('DJANGO_LOG_LEVEL', 'INFO'),
  },
 },
}
......

好处:

1. 安全性。可以将敏感信息放环境变量,而不是代码里。分离开来。

2. 可读性。查看大部分配置的时候只需要看env文件就行了

3. 可维护性。减少代码,简洁清晰。可以只有一份settings.py,一目了然。

4. 灵活性。改配置只需要改环境变量就行了,而不需要改一行代码。

举个例子,如果不用环境变量,是多个settings文件的方式,那么虽然不同环境的LOGGING配置项只有level不一样,却还是得把整个LOGGING配置项的代码都写一遍

LOGGING = {
 'version': 1,
 'disable_existing_loggers': False,
 'handlers': {
  'console': {
   'class': 'logging.StreamHandler',
  },
 },
 'loggers': {
  'django': {
   'handlers': ['console'],
   'level': 'xxx', # 虽然只有这里不一样,但是还是得所有环境的settings文件都写一遍这整个LOGGING配置项. 
  },
 },
}

而使用环境变量的话,可以很精细的在不一样的地方动态根据环境变量设置。只需要在这一行'level': env.str(‘DJANGO_LOG_LEVEL', ‘INFO')。

更多的可以查看官方文档

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python使用wxpython开发简单记事本的方法
May 20 Python
Python操作串口的方法
Jun 17 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
pandas string转dataframe的方法
Apr 11 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
用python实现刷点击率的示例代码
Feb 21 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Python3 类型标注支持操作
Jun 02 Python
Python编程编写完善的命令行工具
Sep 15 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 #Python
django利用request id便于定位及给日志加上request_id
Aug 26 #Python
python如何创建TCP服务端和客户端
Aug 26 #Python
Django压缩静态文件的实现方法详析
Aug 26 #Python
Python实现将Excel转换成xml的方法示例
Aug 25 #Python
Python实现的简单计算器功能详解
Aug 25 #Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 #Python
You might like
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
浅析PHP绘图技术
2013/07/03 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
js获取内联样式的方法
2015/01/27 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
python psutil模块使用方法解析
2019/08/01 Python
python中Django文件上传方法详解
2020/08/05 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
应用心理学个人的求职信
2013/12/08 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
五年级学生评语
2014/04/22 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
企业标语口号
2014/06/10 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
老干部座谈会主持词
2015/07/03 职场文书
2016教师节问候语
2015/11/10 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python