Внедрение зависимостей в INSTALLED_APPs из повторно используемого приложения - PullRequest
1 голос
/ 05 апреля 2019

Недавно я включил коллекцию приложений Django в пространство имен, чтобы мы могли повторно использовать их для нескольких развертываний с различными настройками, мультимедийными файлами и т. Д. Суть этого работала хорошо. Мы можем создать новый проект Django и включить все приложения (из нашего пространства имен), которые нам нужны, в settings.INSTALLED_APPS.

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

INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.messages',
    'import_export',
    'rest_framework',
    'reversion',
    'crispy_forms',

    'our_namespace.our_app',
]

Я бы хотел уменьшить это до:

INSTALLED_APPS = [
    'our_namespace.our_app',  # brings all its dependencies with it
]

Другие настройки проще обрабатывать, но ввод в INSTALLED_APPS кажется трудным. Выполнение этого из AppConfig.ready(), похоже, не работает, потому что - если ни по какой другой причине - запускается только после того, как модели импортировали (что обычно слишком поздно).

Какие у меня есть варианты? Я просто слишком ленивый на этот раз?

1 Ответ

0 голосов
/ 05 апреля 2019

Один из подходов, который я видел, - это этот мезонином , который требует от вас вызова метода в нижней части файла настроек проекта:

try:
    from mezzanine.utils.conf import set_dynamic_settings
except ImportError:
    pass
else:
    set_dynamic_settings(globals())

Если вы затемпосмотрите, что делает set_dynamic_settings (см. ссылку выше), он проверяет параметры, определенные до сих пор, и изменяет, где это необходимо, включая внесение изменений в INSTALLED_APPS, например:

def set_dynamic_settings(s):
    for app in required_apps:   # Where required_apps is a list if apps you need
        if app not in s["INSTALLED_APPS"]:
            s["INSTALLED_APPS"].append(app)

Это единственный способ, которым язнаю, чтобы делать такие вещи.Попытка сделать это из вашего собственного приложения (т. Е. Без добавления какого-либо другого кода в файл настроек) не будет работать, потому что Django уже инициализировал объект настроек к моменту загрузки вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...