標籤:
改篇文章主要翻譯於: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",因為這是一個非Null 字元串,所以返回True
Decouple提供一種能夠解決這個問題的解決方案
:config(‘DEBUG‘, cast=bool)
if os.environ[‘DEBUG‘]: print Trueelse: 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=TrueTEMPLATE_DEBUG=%(DEBUG)sSECRET_KEY=ARANDOMSECRETKEYDATABASE_URL=mysql://myuser:[email protected]/mydatabasePERCENTILE=90%%#COMMENTED=42
注意:因為ConfigParser模組支援字串填充的原因,百分比符號%應該由兩個百分比符號,也就是%%代替
ENV檔案樣本:
在你的程式的根目錄中建立一個.env檔案,例如:
DEBUG=TrueTEMPLATE_DEBUG=TrueSECRET_KEY=ARANDOMSECRETKEYDATABASE_URL=mysql://myuser:[email protected]/mydatabasePERCENTILE=90%#COMMENTED=42
我在django中因該怎麼使用呢?
如果我在我的程式根目錄有一個.env 檔案,下面是我的setting.py程式的一個片段,下面的程式,我推薦unipath和dj-database-url一起配合使用:
# coding: utf-8from decouple import configfrom unipath import Pathfrom 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 = TrueUSE_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
- AutoConfig
- 檢查你使用的配置
- 它將從你的配置模組路徑遞迴的搜尋settings.ini或者.env檔案
一個簡單的例子:
.evn檔案
user_info=rootport=3306ipadd=127.0.0.1switch=on
pyton解析檔案:
import decoupleconfig = decouple.AutoConfig()ipadd = config(‘ipadd‘)print ipadd
詳細的具體用法可以讀bootcamp的源碼:
https://github.com/vitorfs/bootcamp
python-decouple簡介