利用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 cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
python验证码识别实例代码
Feb 03 Python
Django forms组件的使用教程
Oct 08 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Python机器学习之PCA降维算法详解
May 19 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
python实现手机推送 代码也就10行左右
Apr 12 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
Laravel下生成验证码的类
2017/11/15 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
python动态规划算法实例详解
2020/11/22 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
会计找工作求职信范文
2013/12/09 职场文书
财务主管的岗位职责
2013/12/30 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
企业年度评优方案
2014/06/02 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
创先争优个人总结
2015/03/04 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
爱国主义电影观后感
2015/06/18 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
56句经典英文座右铭
2019/08/09 职场文书
入门学习Go的基本语法
2021/07/07 Golang
mysql的数据压缩性能对比详情
2021/11/07 MySQL
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js