如果在Django中需要使用环境变量,为何不考虑使用django-environ呢?
在开发后端的过程中,总会有一些想保密的值不可避免地浮现出来,比如AWS的秘密密钥、API密钥、数据库连接等等。然而,将这些值硬编码在settings.py中并使用Git进行管理虽然方便,但老实说在安全性上并不可靠。
在这种情况下,我们常常会考虑“以环境变量来管理”,但如果仅仅使用环境变量,也可能使得开发环境的管理变得复杂。
暫時將其設定為環境變數的陷阱
我使用Mac作为开发环境。
我使用Pythonista首选的PyCharm作为IDE。
创建环境变量配置文件
# MySQL
DB_NAME=db_name
DB_PASSWORD=hogepass
DB_USER=hogehoge
DB_HOST=127.0.0.1
DB_PORT=3306
DB_ENGINE=django.db.backends.mysql
# AWS Settings
DJANGO_AWS_S3_BUCKET_NAME=huga-storage
DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx
编辑settings.py文件
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
・・・
AWS_S3_BUCKET_NAME=os.environ['DJANGO_AWS_S3_BUCKET_NAME']
AWS_ACCESS_KEY=os.environ['DJANGO_AWS_ACCESS_KEY']
AWS_SECRET_KEY=os.environ['DJANGO_AWS_SECRET_KEY']
DATABASES = {
'default': {
'ENGINE': os.environ['POSTGRES_ENGINE'],
'NAME': os.environ['POSTGRES_NAME'],
'USER': os.environ['POSTGRES_USER'],
'PASSWORD': os.environ['POSTGRES_PASSWORD'],
'HOST': os.environ['POSTGRES_HOST'],
'PORT': os.environ['POSTGRES_PORT'],
}
}
・・・
这样,是这个意思吧。
问题所在
-
- コマンドラインから行う時はMacの環境変数にセットしなければならない。
- Macの環境変数にセットしてなかったらPycharmRun/Debug Configrationsで環境変数をいちいち指定しないといけない。
只是两个点,但也是两个点。
即使首先在Linux操作中创建了.env文件以进行预期的导出工作,但在Mac上如果不执行export命令就无法将其注册为环境变量…
我不想每次都创建这样的Shell脚本来修改环境变量并执行。
#!/bin/sh
# ファイルを1行ずつ読み込んで表示
TESTFILE=./.env
while read line; do
export $line
done < $TESTFILE
所以,让我们消除这种浪费吧。
使用django-environ库
Github
https://github.com/joke2k/django-environ
感谢(-人-)
引入
$ pip install django-environ
修改环境变量设置文件
# MySQL
DATABASE_URL=mysql://hogehoge:hogepass@127.0.0.1:3306/db_name
# AWS Settings
DJANGO_AWS_S3_BUCKET_NAME=huga-storage
DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx
改善settings.py文件
import environ
# settings.pyの位置を起点として3つ上の親ディレクトリを参照。
BASE_DIR = environ.Path(__file__) - 3
env = environ.Env()
# 環境変数でDJANGO_READ_ENV_FILEをTrueにしておくと.envを読んでくれる。
READ_ENV_FILE = env.bool('DJANGO_READ_ENV_FILE', default=False)
if READ_ENV_FILE:
env_file = str(BASE_DIR.path('.env'))
env.read_env(env_file)
・・・
AWS_S3_BUCKET_NAME=env('DJANGO_AWS_S3_BUCKET_NAME')
AWS_ACCESS_KEY=env('DJANGO_AWS_ACCESS_KEY')
AWS_SECRET_KEY=env('DJANGO_AWS_SECRET_KEY')
DATABASES = {
'default': env.db() # デフォルトでDATABASE_URLの環境変数を分解してくれる
}
・・・
使用中国本地语言进行再述,只需一个选项:
积分
-
- Macに環境変数を設定しなくても、1つ環境変数をTrueにしておけば .env を読んでくれる。
-
- DATABASE_URLという環境変数で一行書くことでDBの定義ができる
- ディレクトリのベースディレクトリ定義などがスッキリする。
顺便提一下,除了数据库之外,还可以使用一行代码定义缓存等内容。
如果将DJANGO_READ_ENV_FILE设置为True,即使修改了.env文件,每次也会重新读取,非常方便。
总结
使用的方法只是一个例子,但光是这样就变得清晰易读的代码了。
将其作为环境变量还能增加安全性,并且不再需要在开发和生产环境中切换设置文件。
由于开源软件每天都在进行添加、改进等工作,所以我们需要确保没有灵活适应需求的库一直存在。
同时,不要完全依赖他人开发的库,也要积极地对开源软件做贡献!
让我们OSS人生吧!