Django 设置 SECRET_KEY
Django settings SECRET_KEY
我的项目结构如下
project
--project
----settings
------base.py
------development.py
------testing.py
------secrets.json
--functional_tests
--manage.py
development.py 和 testing.py 'inherit' 来自 base.py
from .base import *
那么,我哪里有问题
我在 secrets.json 中有 Django 的 SECRET_KEY,它存储在 settings 文件夹中
我像这样加载这个密钥(在 "Two scoops of Django" 中看到了这个)
import json
from django.core.exceptions import ImproperlyConfigured
key = "secrets.json"
with open(key) as f:
secrets = json.loads(f.read())
def get_secret(setting, secret=secrets):
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
SECRET_KEY = get_secret("SECRET_KEY")
但是当我运行python manage.py runserver
Blah-blah-blah
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
经过一些调查,我得到了以下信息
- 如果我把
print(os.getcwd())
放在 base.py 里面,我得到 /media/grimel/Home/project/
而不是 /media/grimel/Home/project/project/settings/
- 此代码仅在我替换时有效:
key = "secrets.json"
通过
key = "project/settings/secrets.json"
就我个人而言,我不喜欢这个解决方案。
所以,问题:
- 为什么 base.py 当前工作目录如此混乱?
- 解决这个问题的更好方法是什么?
工作目录取决于您 运行 程序的方式,在您的情况下 python manage.py runserver
暗示您的工作目录是包含 manage.py
的目录。请注意,当 运行 作为 WSGI 脚本或其他方式时,这可能会有所不同,因此您对使用 key = "project/settings/secrets.json"
的担忧是有效的。
一种解决方案是在 base.py
中使用 __file__
的值,可能是 "project/settings/base.py"
。我会使用类似
的东西
import os
BASE_DIR = os.path.dirname(__file__)
key = os.path.join(BASE_DIR, "secrets.json")
为了让生活更简单,为什么不将 secrets.json
移动到您的项目根目录并引用
import os
key = os.path.join(BASE_DIR, "secrets.json")
直接。这是独立于平台的,您无需在设置文件中完全覆盖 BASE_DIR
。不要忘记将您的设置文件添加到版本控制中。
我的项目结构如下
project
--project
----settings
------base.py
------development.py
------testing.py
------secrets.json
--functional_tests
--manage.py
development.py 和 testing.py 'inherit' 来自 base.py
from .base import *
那么,我哪里有问题
我在 secrets.json 中有 Django 的 SECRET_KEY,它存储在 settings 文件夹中
我像这样加载这个密钥(在 "Two scoops of Django" 中看到了这个)
import json
from django.core.exceptions import ImproperlyConfigured
key = "secrets.json"
with open(key) as f:
secrets = json.loads(f.read())
def get_secret(setting, secret=secrets):
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
SECRET_KEY = get_secret("SECRET_KEY")
但是当我运行python manage.py runserver
Blah-blah-blah
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
经过一些调查,我得到了以下信息
- 如果我把
print(os.getcwd())
放在 base.py 里面,我得到/media/grimel/Home/project/
而不是/media/grimel/Home/project/project/settings/
- 此代码仅在我替换时有效:
key = "secrets.json"
通过
key = "project/settings/secrets.json"
就我个人而言,我不喜欢这个解决方案。
所以,问题:
- 为什么 base.py 当前工作目录如此混乱?
- 解决这个问题的更好方法是什么?
工作目录取决于您 运行 程序的方式,在您的情况下 python manage.py runserver
暗示您的工作目录是包含 manage.py
的目录。请注意,当 运行 作为 WSGI 脚本或其他方式时,这可能会有所不同,因此您对使用 key = "project/settings/secrets.json"
的担忧是有效的。
一种解决方案是在 base.py
中使用 __file__
的值,可能是 "project/settings/base.py"
。我会使用类似
import os
BASE_DIR = os.path.dirname(__file__)
key = os.path.join(BASE_DIR, "secrets.json")
为了让生活更简单,为什么不将 secrets.json
移动到您的项目根目录并引用
import os
key = os.path.join(BASE_DIR, "secrets.json")
直接。这是独立于平台的,您无需在设置文件中完全覆盖 BASE_DIR
。不要忘记将您的设置文件添加到版本控制中。