在哪里存储密钥DJANGO
在我的一生中,我一直在到处寻找这个问题,却没有找到答案。我希望我没有张贴一个重复 建议您将密钥保存在与general settings.py分开的文件中。另外,您不应该提交包含密钥(如secret\u KEY、AWS\u secret\u KEY等)的“secret.py”文件 我的问题是:在生产服务器中,您需要引用您的密钥,这意味着您的“secret.py”设置文件应该位于服务器周围,对吗?如果是这样,您如何在生产中保护您的密钥 请参阅 生产有很多选择。我的方法是将敏感数据变量设置为生产环境中的环境变量。然后我通过在哪里存储密钥DJANGO,django,django-settings,Django,Django Settings,在我的一生中,我一直在到处寻找这个问题,却没有找到答案。我希望我没有张贴一个重复 建议您将密钥保存在与general settings.py分开的文件中。另外,您不应该提交包含密钥(如secret\u KEY、AWS\u secret\u KEY等)的“secret.py”文件 我的问题是:在生产服务器中,您需要引用您的密钥,这意味着您的“secret.py”设置文件应该位于服务器周围,对吗?如果是这样,您如何在生产中保护您的密钥 请参阅 生产有很多选择。我的方法是将敏感数据变量设置为生产环境中
os.environ
检索settings.py
中的变量,如下所示:
导入操作系统
SECRET\u KEY=os.environ['SECRET\u KEY']
另一个可能的选项是通过部署脚本复制secret.py
文件
我相信对于不同的web服务器也有其他特定的选项。您应该以模块化的方式存储设置。我的意思是将你的设置分散到多个文件中 例如,您可以使用
base\u settings.py
来存储所有基本设置dev_settings.py
用于开发服务器设置;最后是所有生产设置的prod\u base\u settings.py
。所有非基本设置文件将导入所有基本设置,然后仅更改任何必要的内容:
# base_settings.py
...
# dev_settings.py
from base_settings import *
DEBUG = TRUE
...
# prod_base_settings.py
from base_settings import *
DEBUG = FALSE
...
这种方法允许您从不同的设置中进行不同的设置。您还可以提交所有这些文件,但可以在生产服务器上创建实际生产设置文件prod_settings.py
,在该文件中指定所有敏感设置。此文件不应提交到任何地方,且其内容应保持安全:
# prod_settings.py
from prod_base_settings import *
SECRET_KEY = 'foo'
至于文件名,您可以使用您认为合适的任何文件名。我个人实际上为设置创建了一个Python包,然后将各种设置保存在包中:
project/
project/
settings/
__init__.py
base.py
dev.py
...
app1/
models.py
...
app2/
models.py
...
您应该使用专为分解敏感数据而设计的工具,而不是if/then逻辑。我用山药酱。它允许os.environ方法的所有优点,但更简单——您仍然需要设置这些环境变量,您需要将它们放在脚本中的某个地方。YamJam将这些配置设置存储在机器配置存储中,还允许逐个项目覆盖
from YamJam import yamjam
variable = yamjam()['myproject']['variable']
这是基本用法。与os.environ方法一样,它不是特定于框架的,您可以将其与Django或任何其他应用程序/框架一起使用。我都试过了,多个settings.py文件,脆弱的if/then逻辑和环境纠纷。最后,我改用yamjam,并没有后悔。我知道这已经有很长时间了,但我刚刚开源了一个小的Django应用程序,我正在使用它生成一个新的密钥,如果它还不存在的话。它被称为 然后,在配置/部署运行Django项目的新服务器时,我运行以下命令(来自Ansible): 它只是:
- 检查是否需要生成密钥
- 在
文件中生成(可自定义)secretkey.txt
with open('/path/to/the/secretkey.txt') as f:
SECRET_KEY = f.read().strip()
您现在可以从完全自动化的资源调配过程中获益,而无需在存储库中存储静态密钥。我想添加一个新答案,因为作为初学者,以前接受的答案对我来说没有多大意义(这只是谜题的一部分) 下面是我在本地和生产环境中存储密钥的方法(Heroku和其他人) 注意:如果你打算将项目上线,你真的只需要这样做。如果这只是一个本地项目,没有必要 1)安装python dotenv以创建本地项目环境来存储密钥。
pip install python-dotenv
YourDjangoProject
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
echo .env > .gitignore # Or just open your .gitignore and type in .env
2)在基本目录中创建一个.env
文件(其中manage.py
是)。
pip install python-dotenv
YourDjangoProject
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
echo .env > .gitignore # Or just open your .gitignore and type in .env
如果您有一个Heroku项目,它应该如下所示:
YourDjangoProject
├───.git
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───venv
├───.env
├───.gitignore
├───manage.py
├───Procfile
├───requirements.txt
└───runtime.txt
SECRET_KEY=blabla
OTHER_SECRET=blabla
3)将.env
添加到.gitignore
文件中。
pip install python-dotenv
YourDjangoProject
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
echo .env > .gitignore # Or just open your .gitignore and type in .env
这就是如何使您的密钥更加安全的方法,因为您不会将.env文件上载到git或heroku(或其他任何地方)
4)将您的密钥从settings.py文件添加到.env文件中,就像这样(不带引号)
现在您不需要导入os
或使用dotenv
,因为它会为您处理这些部分,并且仍将使用.env文件。我开始在我所有的项目中使用它
6)在主机(如Heroku)上添加密钥环境变量。
pip install python-dotenv
YourDjangoProject
├───project
│ ├───__init__.py
│ ├───asgi.py
│ ├───settings.py
│ ├───urls.py
│ └───wsgi.py
├───.env
├───manage.py
└───db.sqlite3
echo .env > .gitignore # Or just open your .gitignore and type in .env
我主要与Heroku网站合作,所以如果你想在Django项目中使用Heroku,这部分是为你准备的 这假设您已经有了Heroku项目设置,并且已经在计算机上下载了Heroku CLI 您有两种选择:
import os
import dotenv # <- New
# Add .env variables anywhere before SECRET_KEY
dotenv_file = os.path.join(BASE_DIR, ".env")
if os.path.isfile(dotenv_file):
dotenv.load_dotenv(dotenv_file)
# UPDATE secret key
SECRET_KEY = os.environ['SECRET_KEY'] # Instead of your actual secret key
就这样 在环境中存储秘密仍然会将其放置在环境中;如果未经授权的用户获得对环境的访问权,则可以利用该漏洞。列出环境变量是一项微不足道的工作,而命名一个
SECRET
对于一个坏的参与者和一个不需要的用户来说是非常有帮助和明显的
然而,秘密在生产中是必要的,那么如何获取它们呢