Django中的环境变量?然后使用django-environ。


开发后端时,要保密的值是不可避免的。
AWS秘密密钥,API密钥,数据库连接信息等...
但是,很容易在settings.py中对其进行硬编码并使用Gi??t对其进行管理,但老实说,这样做不利于安全。

关于

,我认为在很多情况下"让我们用环境变量进行管理",但是
如果仅将其设置为环境变量,则在开发环境中对其进行管理可能会很麻烦。

暂时将其设置为环境变量时进行陷阱

开发环境为Mac。
IDE使用PyCharm,它是Pythonista的供应商。

创建环境变量配置文件

.env

1
2
3
4
5
6
7
8
9
10
11
12
# 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

settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的环境变量中进行设置,则必须使用Pycharm Run/Debug Configrations逐一指定环境变量。

仅2点,但2点。
首先,即使您在假定Linux操作的情况下创建.env,也不能在环境变量中注册它,除非您在Mac上export ...
我不想创建一个像↓这样的shell脚本,并在每次修改环境变量时都执行它。

env.sh

1
2
3
4
5
6
7
#!/bin/sh
# ファイルを1行ずつ読み込んで表示

TESTFILE=./.env
while read line; do
    export $line
done < $TESTFILE

让我们通过说

消除这种浪费。

使用django-environ

Github
https://github.com/joke2k/django-environ
谢谢(-people-)

推出

1
$ pip install django-environ

固定环境变量配置文件

.env

1
2
3
4
5
6
7
# MySQL
DATABASE_URL=mysql://hogehoge:[email protected]:3306/db_name

# AWS Settings
DJANGO_AWS_S3_BUCKET_NAME=huga-storage
DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx

改进的设置.py

settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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上设置环境变量,也可以将一个环境变量设置为True,它将读取.env
  • 可以通过写一行名为DATABASE_URL的环境变量来定义DB。
  • 目录的基本目录定义正在刷新。

顺便说一句,除了DB,还可以在一行中定义缓存。
如果将DJANGO_READ_ENV_FILE设置为True,则即使您修改了.env,每次也会再次读取它,这非常方便。

概要

所使用的方法是一个示例,但这仅使代码更简洁。
通过使其成为环境变量,它成为一种安全措施,并且不需要在开发和生产之间切换设置文件。
OSS每天都在增加和改进,因此确保在不知情的情况下不要创建会引起痒的库非常重要。
而且,我们不要完全依靠人们开发的库,而应该为OSS做出积极的贡献!

让我们的OSS Life !!!