利用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 HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
Python类的继承和多态代码详解
Dec 27 Python
python删除某个字符
Mar 19 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python开发网站目录扫描器的实现
Feb 21 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Python必须了解的35个关键词
Jul 16 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python中的流程控制详解
Feb 18 Python
python库sklearn常用操作
Aug 23 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python多线程并发实例及其优化
2019/06/27 Python
基于python实现把图片转换成素描
2019/11/13 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
判断单链表中是否存在环
2012/07/16 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
有趣的广告词
2014/03/18 职场文书
工作分析计划书
2014/04/30 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
工商局个人工作总结
2015/03/03 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
行政处罚听证告知书
2015/07/01 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python