利用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读文件逐行处理的示例代码分享
Dec 27 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
使用python实现knn算法
Dec 20 Python
分析python请求数据
Aug 19 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python实现祝福弹窗效果
Apr 07 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
Python实现打包成库供别的模块调用
Jul 13 Python
Python实现手势识别
Oct 21 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 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
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
js 编写规范
2010/03/03 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
python 排列组合之itertools
2013/03/20 Python
Python3实现生成随机密码的方法
2014/08/23 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Android interview questions
2016/12/25 面试题
仓库班组长岗位职责
2013/12/12 职场文书
办理暂住证介绍信
2014/01/11 职场文书
幼师自我鉴定
2014/02/01 职场文书
环保倡议书100字
2014/05/15 职场文书
办公室卫生管理制度
2015/08/04 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS