利用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 相关文章推荐
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
python如何统计序列中元素
Jul 31 Python
Django rest framework实现分页的示例
May 24 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
详解Python模块化编程与装饰器
Jan 16 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多层数组与对象的转换实例代码
2013/08/05 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
php fread读取文件注意事项
2016/09/24 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
python切割图片的示例
2020/11/12 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
同事吵架检讨书
2014/02/05 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
指导老师鉴定意见
2015/06/05 职场文书
八年级作文之感恩
2019/11/22 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
Python中的 enumerate和zip详情
2022/05/30 Python