Tengo esta configuración estándar generada por django:

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

Y esta funcionando. Sin embargo, quiero reorganizar este diseño para esto:

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

Cuando lo hago, por supuesto, no funciona:

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

Entonces, ¿dónde y qué necesito cambiar para que esto funcione?

1
Alexey 23 feb. 2018 a las 12:27

4 respuestas

La mejor respuesta

Es muy simple, solo edite manage.py:

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

Para

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

Y también wsgi.py

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

Para

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.base")
0
Alexey 23 feb. 2018 a las 10:03

Django está buscando en la variable DJANGO_SETTINGS_MODULE env de forma predeterminada. Está configurado para '{your_project_name}.settings' módulo o paquete (nuevamente, por defecto). Por lo tanto, puede modificarlo para que sea '{your_project_name}.settings.base' para leer la configuración del módulo base.py.

Pero también puede lograrlo sin modificar las variables de entorno. Con la estructura de su carpeta, Django está buscando en el paquete settings que ha creado. Por lo tanto, solo necesita importar todas las configuraciones definidas en base.py allí. Simplemente coloque este código en el módulo settings/__init__.py:

from .base import *

Esto le permite importar configuraciones de diferentes módulos y realizar una lógica más compleja como verificar las variables de entorno e importar configuraciones basadas en su entorno actual. Por ejemplo, importando configuraciones al verificar en qué entorno se está ejecutando la aplicación:

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 feb. 2018 a las 10:27

Si movió su settings.py anterior a settings/base.py, supongo que desea dividir la configuración de Django en varios archivos. Por lo tanto, lo único que debe hacer es asegurarse de que todas sus configuraciones estén disponibles a nivel de módulo. En settings/__init__.py, escribe algo como

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

Luego, todas las variables de configuración (settings.SECRET_KEY, settings.DEBUG, etc.) estarán disponibles para el resto de la aplicación Django, sin necesidad de modificar el valor predeterminado DJANGO_SETTINGS_MODULE.

Bonificación: con este método, puede anular una configuración definida en base.py en otro archivo tan pronto como importe base primero en __init__.py

0
Antwane 23 feb. 2018 a las 10:08

Bueno, de acuerdo con su error que dice, no tiene SECRET_KEY definido. Necesita agregar uno a su settings.py. Django se negará a comenzar si SECRET_KEY no está configurado. Puede leer más al respecto en docs

SECRET_KEY puede ser cualquier cosa ... pero si desea utilizar Django para generar uno, puede hacer lo siguiente desde el shell de Python:

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

Copie secret_key en su archivo de configuración.

¡Espero que esto te ayudará! :)

0
Abdullah Ahmed Ghaznavi 23 feb. 2018 a las 09:47