Django 设置 SECRET_KEY

Django settings SECRET_KEY

我的项目结构如下

project
--project
----settings
------base.py
------development.py
------testing.py
------secrets.json
--functional_tests
--manage.py

development.pytesting.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.

经过一些调查,我得到了以下信息

  1. 如果我把 print(os.getcwd()) 放在 base.py 里面,我得到 /media/grimel/Home/project/ 而不是 /media/grimel/Home/project/project/settings/
  2. 此代码仅在我替换时有效:
    key = "secrets.json"
    通过
    key = "project/settings/secrets.json"

就我个人而言,我不喜欢这个解决方案。
所以,问题:

  1. 为什么 base.py 当前工作目录如此混乱?
  2. 解决这个问题的更好方法是什么?

工作目录取决于您 运行 程序的方式,在您的情况下 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 。不要忘记将您的设置文件添加到版本控制中。