如果在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人生吧!

广告
将在 10 秒后关闭
bannerAds