利用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实现简单状态框架的方法
Mar 19 Python
Python中利用sorted()函数排序的简单教程
Apr 27 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
Python实现的个人所得税计算器示例
Jun 01 Python
python 对key为时间的dict排序方法
Oct 17 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 Python
python实现按行分割文件
Jul 22 Python
Python设计密码强度校验程序
Jul 30 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 Python
python 实现的截屏工具
May 08 Python
Python几种酷炫的进度条的方式
Apr 11 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 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
js创建对象的方式总结
2015/01/10 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
DOM 高级编程
2015/05/06 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python 串口读写的实现方法
2019/06/12 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
护士进修自我鉴定
2014/02/07 职场文书
运动会广播稿150字
2014/02/19 职场文书
大学生入党群众意见书
2015/06/02 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python