Настройки Django не найдены при попытке развертывания - PullRequest
2 голосов
/ 07 мая 2019

У меня есть настройки приложения Django в папке внутри папки приложения с init .py, и это прекрасно работает на моем текущем VPS-сервере, в разработке Pycharm и в локальной среде разработки Divio. Тем не менее, когда я пытаюсь развернуть его в Divio Staging, я получаю «ModuleNotFoundError: Нет модуля с именем« settings »». Почему это?

Manage.py:

#!/usr/bin/env python
import os
from aldryn_django import startup


if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
    startup.manage(path=os.path.dirname(os.path.abspath(__file__)))

Нет файла settings.py

Папка называется настройки с:

_ init _.py

from .dev_divio import *  # or .dev if you want dev
from .common import *

INSTALLED_ADDONS = [
    # <INSTALLED_ADDONS>  # Warning: text inside the INSTALLED_ADDONS tags is auto-generated. Manual changes will be overwritten.
    'aldryn-addons',
    'aldryn-django',
    'aldryn-sso',
    # </INSTALLED_ADDONS>
]

import aldryn_addons.settings
aldryn_addons.settings.load(locals())

# Application definition
INSTALLED_APPS.extend([
    # add your project specific apps here
    # 'django.contrib.admin',
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.messages',
    # 'django.contrib.staticfiles',
    # 'django.contrib.sites',
    'rest_framework',
    'rest_framework.authtoken',
    'appname',
])

который импортирует:

common.py dev_divio.py

Два файла выше имеют конфигурацию в.

1 Ответ

2 голосов
/ 08 мая 2019

Вы были почти там.

Как Django находит свои настройки в проектах Divio

Ваше изменение на manage.py разрешило collectstatic, выполняемый Dockerfile:

RUN DJANGO_MODE=build python manage.py collectstatic --noinput

чтобы найти настройки правильно.По сути, вы жестко закодировали переменную окружения DJANGO_SETTINGS_MODULE в manage.py.

Это позволит любой команде manage.py найти настройки, чтобы (как вы обнаружили) вы моглизапускать сайт локально.

Однако другие команды также должны знать, где находятся настройки, например, команда start web, которая используется в облачных развертываниях, или локально, если вы запустить локальный сервер в оперативной конфигурации .

Эти команды основаны на правильно заданной переменной среды DJANGO_SETTINGS_MODULE, которую можно установить локально в .env-local, или для облачных серверов с помощью Переменные среды вид на панели управления.

Однако установленные таким образом переменные среды будут доступны только в том случае, если контейнеры запускаются из образа, для которого уже был построен .Они не будут доступны для команды collectstatic, которая находится в Dockerfile, потому что на этом этапе образ строится .

Нелегко предоставлять одну и ту же информацию дважды, иособенно для жесткого кодирования переменной среды в модуле Python.

Лучшее решение

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

ENV DJANGO_SETTINGS_MODULE=app.settings

в Dockerfile (перед выполнением любых команд Django).

Это сделает переменную доступной сразу же, а также запечетает ее в образ, так что каждый созданный из нее контейнер будет содержать эту переменную по умолчанию.

Переменные, установленные таким образом, все еще могут быть переопределены вна основе окружающей среды.

...