作者:studytime
原文:https://www.studytime.xin/
簡述
本文主要是整理如何在 django 專案中解決不同環境下載入不同 .env 環境配置檔案的方案。主要內容包含 django-environ 的安裝使用,以及 django-crontab 指令碼環境下的配置使用。
django-environ 的使用
安裝
pip install django-environ
使用
- 建立 .env檔案
# 專案目錄中
touch .env
# 增加環境變數
DEBUG=True
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret
- 與
settings.py
一起使用。為了方便使用目前使用gitlab為內網環境,故而.env
不需要加入.gitignore
,實現檔案忽略上傳。
import environ
# initialize env
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env()
# False if not in os.environ
DEBUG = env('DEBUG')
# Raises django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')
# Parse database connection url strings like psql://user:pass@127.0.0.1:8458/db
DATABASES = {
# read os.environ['DATABASE_URL'] and raises ImproperlyConfigured exception if not found
'default': env.db(),
# read os.environ['SQLITE_URL']
'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
}
CACHES = {
# read os.environ['CACHE_URL'] and raises ImproperlyConfigured exception if not found
'default': env.cache(),
# read os.environ['REDIS_URL']
'redis': env.cache('REDIS_URL')
}
如何實現不同環境下載入不同環境變數
在只使用一個 settings.py 檔案情況下,可以只使用一個環境變數,通過此環境變數來讀取不同環境的 .env 檔案以區分不同環境。
這個環境變數就沒法寫在 .env 檔案了,必須手動指定。假設我們這個環境變數叫PROJECT_ENV。那麼我們在命令列執行任何命令的時候,在前面加上PROJECT_ENV=xxx來指定環境變數。
當然,也可以export來指定這個環境變數,也可以修改shell配置檔案來指定這個環境變數,甚至supervisord和uwsgi的配置檔案也可以指定環境變數。
執行方法
PROJECT_ENV=local python manage.py runserver
多環境.env檔案設定
假設目前存在 local 以及 product 兩種環境,則在 envs 下新建 .env.local 以及 .env.product 檔案。
settings.py 程式碼相容
import os
import environ
import logging.config
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
"""
通過指定環境遍歷載入不同env檔案
PROJECT_ENV=production python manage.py crontab add
預設場景下可不指定,則載入local檔案
"""
env_name = env.str('PROJECT_ENV', 'local')
# reading .env file
env.read_env('envs/.env.%s' % env_name)
如何在 django-crontab 指令碼環境下載入不同配置
django-crontab 的使用可以參考 django-crontab實現服務端的定時任務
程式碼調整
在 settings.py 檔案中,django-crontab 配置任務 CRONJOBS 下增加
`
CRONTAB_COMMAND_PREFIX = ‘PROJECT_ENV=’ + env_name` 引數指定
CRONJOBS = [
("*/5 * * * *", "analysis.cron.test_cron", ">>" + LOG_DIR + "log/fba_claim_shipment.log"),
]
CRONTAB_COMMAND_PREFIX = 'PROJECT_ENV=' + env_name
執行方法
PROJECT_ENV=local python manage.py crontab add
本作品採用《CC 協議》,轉載必須註明作者和本文連結