У меня есть стандартные настройки, созданные Django:

project/project
        |   __init__.py
        |   settings.py
        |   urls.py
        |   wsgi.py

И это работает. Тем не менее, я хочу реорганизовать этот макет так:

project/project/settings
                |   __init__.py
                |   base.py
        |   __init__.py
        |   urls.py
        |   wsgi.py

Когда я делаю это, конечно, это не работает:

django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

Так где и что мне нужно изменить, чтобы это работало?

1
Alexey 23 Фев 2018 в 12:27

4 ответа

Лучший ответ

Это очень просто, просто отредактируйте manage.py:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

Кому

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.base")

А также wsgi.py

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

Кому

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.base")
0
Alexey 23 Фев 2018 в 10:03

Django ищет переменную env DJANGO_SETTINGS_MODULE по умолчанию. Это установлено '{your_project_name}.settings' модуль или пакет (опять же по умолчанию). Таким образом, вы можете изменить его на '{your_project_name}.settings.base' для чтения настроек из модуля base.py.

Но вы также можете сделать это без изменения переменных среды. С вашей структурой папок Django просматривает созданный вами пакет settings. Итак, вам просто нужно импортировать все настройки, определенные в base.py там. Просто поместите этот код в модуль settings/__init__.py:

from .base import *

Это позволяет вам импортировать настройки из разных модулей и выполнять более сложную логику, такую как проверка переменных среды и импорт настроек на основе вашей текущей среды. Например, импорт настроек путем проверки среды, в которой работает приложение:

import logging
import os


# Default is local environment
environment = os.getenv('MACHINE_ENV', 'local')

if environment:
    if environment.lower() == 'local':
        from .local import *
    elif environment.lower() == 'staging':
        from .staging import *
    elif environment.lower() == 'prod':
        from .prod import *
0
IntFolk 23 Фев 2018 в 10:27

Если вы переместили свой старый settings.py в settings/base.py, я предполагаю, что вы хотите разделить настройки Django на несколько файлов. Таким образом, единственное, что вам нужно сделать, это убедиться, что все ваши настройки доступны на уровне модуля. В settings/__init__.py напишите что-то вроде

from .base import *
from .another_setting_file import *
# etc.

Затем все переменные настроек (settings.SECRET_KEY, settings.DEBUG и т. Д.) Будут доступны для остальной части приложения Django без необходимости изменять значение по умолчанию DJANGO_SETTINGS_MODULE.

Бонус: используя этот метод, вы можете переопределить настройку, определенную в base.py, в другом файле, как только вы импортируете base сначала в __init__.py

0
Antwane 23 Фев 2018 в 10:08

В соответствии с вашей ошибкой, которая говорит, у вас нет SECRET_KEY. Вы должны добавить один в ваши settings.py. Django откажется запускаться, если SECRET_KEY не установлен. Подробнее об этом можно прочитать в документах.

SECRET_KEY может быть чем угодно ... но если вы хотите использовать Django для его генерации, вы можете сделать следующее из оболочки python:

>>> from django.utils.crypto import get_random_string
>>> chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
>>> SECRET_KEY = get_random_string(50, chars)
>>> print SECRET_KEY

Скопируйте secret_key в ваш файл настроек.

Надеюсь, что это поможет вам! :)

0
Abdullah Ahmed Ghaznavi 23 Фев 2018 в 09:47