利用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 multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
python django事务transaction源码分析详解
Mar 17 Python
python实现感知器算法详解
Dec 19 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
python os用法总结
Jun 08 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
Python获取百度热搜的完整代码
Apr 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
JS求平均值的小例子
2013/11/29 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
Angular的$http与$location
2016/12/26 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python从入门到精通(DAY 3)
2015/12/20 Python
浅析Python中的多条件排序实现
2016/06/07 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
实例讲解python中的序列化知识点
2018/10/08 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
python实现ping命令小程序
2020/12/28 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
班组长的岗位职责
2013/12/09 职场文书
2014春晚主持词
2014/03/25 职场文书
文艺晚会策划方案
2014/06/11 职场文书
旷课检讨书范文
2014/10/30 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
实验室安全管理制度
2015/08/05 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python