开发后端时,要保密的值是不可避免的。
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上
我不想创建一个像↓这样的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,还可以在一行中定义缓存。
如果将
概要
所使用的方法是一个示例,但这仅使代码更简洁。
通过使其成为环境变量,它成为一种安全措施,并且不需要在开发和生产之间切换设置文件。
OSS每天都在增加和改进,因此确保在不知情的情况下不要创建会引起痒的库非常重要。
而且,我们不要完全依靠人们开发的库,而应该为OSS做出积极的贡献!
让我们的OSS Life !!!