利用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在校内发人人网状态(人人网看状态)
Feb 19 Python
Python多线程实例教程
Sep 06 Python
python根据文件大小打log日志
Oct 09 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
python matlibplot绘制3D图形
Jul 02 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
Softmax函数原理及Python实现过程解析
May 22 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 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
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
js计算精度问题小结
2013/04/22 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
Vue入门之animate过渡动画效果
2018/04/08 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
详解Python中的文本处理
2015/04/11 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
Django celery异步任务实现代码示例
2020/11/26 Python
详解pandas映射与数据转换
2021/01/22 Python
python如何实现递归转非递归
2021/02/25 Python
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
代理班主任的自我评价
2014/02/04 职场文书
职务说明书范文
2014/05/07 职场文书
社团活动总结报告
2014/06/27 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
详解MySQL集群搭建
2021/05/26 MySQL
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript