Django设置SECRET_KEY

时间:2015-12-26 00:26:34

标签: python django-1.8

我的项目结构如下

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

development.py testing.py '继承'来自 base.py

from .base import *

所以,我遇到问题

我在secretts.json中有Django的SECRET_KEY,它存储在设置文件夹

我像这样加载这个键(在#34中看到这个; 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

  

夸夸其谈-嗒嗒
  django.core.exceptions.ImproperlyConfigured:SECRET_KEY设置不能为空。

经过一些调查后,我得到了以下内容

  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"
  3. 就个人而言,我不喜欢这个解决方案 所以,问题:

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

2 个答案:

答案 0 :(得分:3)

工作目录基于您运行程序的方式,在您的情况下python manage.py runserver提示您的工作目录是包含manage.py的目录。请注意,当以WSGI脚本或其他方式运行时,这可能会有所不同,因此您对使用key = "project/settings/secrets.json"的担忧是有效的。

一种解决方案是使用__file__base.py的值,可能是"project/settings/base.py"。我会使用像

这样的东西
import os
BASE_DIR = os.path.dirname(__file__)
key = os.path.join(BASE_DIR, "secrets.json")

答案 1 :(得分:0)

为了简化生活,为什么不将secrets.json移动到项目根目录和参考

import os    
key = os.path.join(BASE_DIR, "secrets.json")

直接。这是独立于平台的,无需在设置文件中覆盖BASE_DIR。不要忘记将您的设置文件添加到版本控制中。