【发布时间】:2014-07-24 12:58:23
【问题描述】:
是否可以在运行时动态加载 Django 应用程序?通常,应用程序在初始化时加载,使用 settings.py 中的 INSTALLED_APPS 元组。但是,是否可以在运行时加载其他应用程序?我在不同的情况下遇到这个问题。例如,在测试期间会出现一种情况,我想动态加载或卸载应用程序。
为了使问题更具体,假设我有一个名为 apps 的目录,我在其中放置了我的应用程序,并且我想自动安装其中的任何新应用程序,而无需手动编辑 settings.py。
这很容易。按照
中的示例代码Django: Dynamically add apps as plugin, building urls and other settings automatically
我们将下面的代码放在settings.py 中,以循环遍历应用目录中所有子目录的名称,并像这样递增settings.py 中的INSTALLED_APPS 元组:
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 shell 中,我可以使用类似的东西
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,即
from myproject import settings
然后reload 即settings 在任何app 目录更改后使用python 内置。尽管现在将 settings.INSTALLED_APPS 更改为包含新添加的应用程序,但这最终没有任何区别。例如,
from django.db import models
models.get_apps()
仅显示 apps 中的原始应用程序,而不显示新添加的应用程序,同样
management.call_command('syncdb', interactive=False)
不会看到新添加的应用。
如上所述,我正在考虑这种情况,特别是在我动态添加或删除应用程序的测试环境中。
附言。我使用 Django 1.6,但根据 @RickyA 的建议,我发现 Django 在 1.7 中对应用程序的处理方式发生了一些重大变化
https://docs.djangoproject.com/en/1.7/ref/applications/
我仍然不确定这对我面临的问题可能意味着什么。
【问题讨论】:
-
我们讨论的是哪个版本的 Django? 1.7 对应用程序进行了大修。
-
我使用的是 1.6。我不知道 1.7 有任何变化。我会检查一下。
-
虽然仍处于测试阶段:(
-
这里有问题吗? - 否则我很想说
The answer is Yes,并将其标记为关闭。 -
有一个问题,我已经编辑了我的原始帖子,希望尽可能清楚。
标签: python django django-settings django-apps