该篇文章主要翻译于:https://pypi.python.org/pypi/python-decouple/
有不对的地方望各位大神指出,谢谢。
decouple简介:
将设置从代码中分离开
decouple将帮助你解析你的程序配置文件,达到更改你的设置而不用重新部署程序的效果
decouple完成的事情:
1. 在ini或者.env文件中存储你的参数
2. 定义你的默认值
3. 适当的将你的配置转换成合适的值
4. 你的程序中只需要一个配置模块来进行设置
decouple最开始是为django开发的,后面成为了一个独立通用的工具,将配置从代码中分离
为什么要使用decouple?
通常情况下,web框架会设置不同种类的参数:
1. 语言环境和国际化
2. 中间件和应用程序
3. 资源存储相关:数据库,cache类。等
4. 外部服务凭证:Amazon S3或者Twitter
5. 预上线环境的设置
前两个是整个项目的设置,后面是部署实例的设置
为什么我们不直接使用环境变量呢?
我们都知道环境变量通过os.environ获取,但是返回的是字符串,比较棘手
例如,你有一
个环境换量DEBUG=False,你可能可以运行如下代码
这段代码将返回Tru
e,因为os.environ['DEBUG'] 返回的是一个
字符串"False",因为这是一个非空字符串,所以返回True
Decouple提供一种能够解决这个问题的解决方案
:config('DEBUG', cast=bool)
if os.environ['DEBUG']: print True else: print False
Decouple的安装:
pip install python-decouple
使用方法:
在
你的settings.py.文件里面,你可以这么写:
1. 导入config对象:
from decouple import config
2. 获取配置参数
SECRET_KEY = config('SECRET_KEY') DEBUG = config('DEBUG', default=False, cast=bool) EMAIL_HOST = config('EMAIL_HOST', default='localhost') EMAIL_PORT = config('EMAIL_PORT', default=25, cast=int)
这些配置文件应该放在哪里?
Decouple支持两种类型:.ini文件和.env 文件
INI文件示例:
创建一个settings.ini文件,下一步在你的文件中可以写入如下格式的配置,例如:
[settings] DEBUG=True TEMPLATE_DEBUG=%(DEBUG)s SECRET_KEY=ARANDOMSECRETKEY DATABASE_URL=mysql://myuser:mypassword@myhost/mydatabase PERCENTILE=90%% #COMMENTED=42
注意:因为ConfigParser模块支持字符串填充的原因,百分号%应该由两个百分号,也就是%%代替
ENV文件示例:
在你的程序的根目录中创建一个.env文件,例如:
DEBUG=True
TEMPLATE_DEBUG=True
SECRET_KEY=ARANDOMSECRETKEY
DATABASE_URL=mysql://myuser:mypassword@myhost/mydatabase
PERCENTILE=90%
#COMMENTED=42
我在django中因该怎么使用呢?
如果我在我的程序根目录有一个.env 文件,下面是我的setting.py程序的一个片段,下面的程序,我推荐unipath和dj-database-url(这两个库很简单以后我再来介绍)一起配合使用:
# coding: utf-8 from decouple import config from unipath import Path from dj_database_url import parse as db_url BASE_DIR = Path(__file__).parent DEBUG = config('DEBUG', default=False, cast=bool) TEMPLATE_DEBUG = DEBUG DATABASES = { 'default': config( 'DATABASE_URL', default='sqlite:///' + BASE_DIR.child('db.sqlite3'), cast=db_url ) } TIME_ZONE = 'America/Sao_Paulo' USE_L10N = True USE_TZ = True SECRET_KEY = config('SECRET_KEY') EMAIL_HOST = config('EMAIL_HOST', default='localhost') EMAIL_PORT = config('EMAIL_PORT', default=25, cast=int) EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='') EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='') EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=False, cast=bool) # ...
注意没有定义的参数:
在上面的例子中,除了
SECRET_KEY = config('SECRET_KEY'),在.env中
都有一个默认的配置参数。
如果
'SECRET_KEY'在
.env文件中一直都没有,decouple 将抛出一个UndefinedValueError
这种策略会当你在忘记配置一个参数的时候发生不可预期的行为
下面将介绍最重要的和环境变量相关的文件:
有些时候你想不通过.ini或者.env文件改变一个参数,从3.0开始,decouple将遵从unix的方式,环境变量优先级高于配置文件变量;
你可以覆盖配置文件的变量:
DEBUG=True python manage.py
这是什么原理呢?
Decouple 有5个类:
- Config
- 检索配置文件所在的位置
- RepositoryIni
- 按照顺序从os.environ,ini文件中读取值
- 注意:从3.0开始unix环境变量高于配置文件变量
- RepositoryEnv
- 按照顺序从os.environ,.env文件中读取值
- 注意:从3.0开始unix环境变量高于配置文件变量
- RepositoryShell
- 只是从os.environ中获取环境变量
- AutoConfig
- 检查你使用的配置
- 它将从你的配置模块路径递归的搜索settings.ini或者.env文件
一个简单的例子:
.evn文件
user_info=root port=3306 ipadd=127.0.0.1 switch=on
pyton解析文件:
import decouple config = decouple.AutoConfig() ipadd = config('ipadd') print ipadd
学习python介绍一个开源项目bootcamp,这个项目可以让你很快的入门django:
https://github.com/vitorfs/bootcamp