利用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设计模式之命令模式简单示例
Jan 10 Python
Python 读写文件的操作代码
Sep 20 Python
浅谈Python中的bs4基础
Oct 21 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
python学生管理系统
Jan 30 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
python单元测试之pytest的使用
Jun 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
PHP文本数据库的搜索方法
2006/10/09 PHP
PHP个人网站架设连环讲(三)
2006/10/09 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
使用python解析xml成对应的html示例分享
2014/04/02 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
django自定义模板标签过程解析
2019/12/14 Python
如何理解python面向对象编程
2020/06/01 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
孝老爱亲模范事迹材料
2014/05/25 职场文书
迎国庆演讲稿
2014/09/15 职场文书
优秀教师个人材料
2014/12/15 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript