利用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使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
python3实现表白神器
Apr 09 Python
python儿童学游戏编程知识点总结
Jun 03 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
Python如何配置环境变量详解
May 18 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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 魔术方法使用说明
2009/10/20 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
如何离线执行php任务
2017/02/21 PHP
Prototype Function对象 学习
2009/07/12 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
vue获取form表单的值示例
2019/10/29 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
谈谈如何手动释放Python的内存
2016/12/17 Python
利用python求相邻数的方法示例
2017/08/18 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Python3获取cookie常用三种方案
2020/10/05 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
What is EJB
2016/07/22 面试题
Python中pass语句的作用是什么
2016/06/01 面试题
医德考评自我评价
2014/09/14 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
家长会欢迎词
2015/01/23 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
单位收入证明范本
2015/06/18 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
详解SQL报错盲注
2022/07/23 SQL Server