Можно ли динамически загружать приложения django во время выполнения? Обычно приложения загружаются при инициализации с использованием кортежа INSTALLED_APPS в settings.py. Однако возможно ли загрузить дополнительные приложения во время выполнения? Я сталкиваюсь с этой проблемой в разных ситуациях. Например, одна ситуация возникает во время тестирования, когда я хочу динамически загружать или выгружать приложения.
Чтобы сделать проблему более конкретной, представьте, что у меня есть каталог с названием apps
куда я помещаю свои приложения, и я хотел бы автоматически установить любое новое приложение, которое появляется там, без ручного редактирования settings.py.
Это достаточно просто. Следуя примеру кода в
мы поместили следующий код в settings.py
чтобы можно было перебирать имена всех подкаталогов в каталоге приложения и увеличивать кортеж INSTALLED_APPS
в settings.py
следующим образом:
APPS_DIR = '/path_to/apps/'
for item in os.listdir(APPS_DIR):
if os.path.isdir(os.path.join(APPS_DIR, item)):
app_name = 'apps.%s' % item
if app_name not in INSTALLED_APPS:
INSTALLED_APPS += (app_name, )
После этого, если бы я был в оболочке Django, я мог бы что-то вроде
from django.conf import settings
и приложения будут перечислены в settings.INSTALLED_APPS
. И если бы я сделал
from django.core import management
management.call_command('syncdb', interactive=False)
это создаст необходимые таблицы БД для приложений.
Однако, если бы я сейчас добавил несколько приложений в каталог apps/
без перезапуска, они не были бы перечислены в settings.INSTALLED_APPS, и поэтому последующий вызов syncdb
не имел бы никакого эффекта.
Я хотел бы знать, есть ли что-то, что я мог бы сделать - без перезапуска - чтобы перезагрузить настройки и загрузить/установить новые приложения.
Я пытался напрямую импортировать мои settings.py
, т.е. из настроек импорта myproject
и затем reload
эти settings
с помощью встроенного Python после любого изменения каталога app
. Несмотря на то, что settings.INSTALLED_APPS теперь изменяется, чтобы включить новые приложения, это в конечном итоге не имеет значения. Например,
from django.db import models
models.get_apps()
показывает только оригинальные приложения в apps
а не недавно добавленные и аналогично
management.call_command('syncdb', interactive=False)
не будет видеть недавно добавленные приложения.
Как я уже говорил выше, я размышлял об этой ситуации, особенно в контексте тестирования, где я динамически добавлял или удалял приложения.
Ps. Я работаю с django 1.6, но по совету @RickyA я вижу, что в django есть некоторые существенные изменения в обработке приложений в 1.7
https://docs.djangoproject.com/en/1.7/ref/applications/
Я все еще не уверен, что это может означать для проблемы, с которой я сталкиваюсь.