gpt4 book ai didi

python - 在运行时动态加载 Django 应用程序

转载 作者:太空狗 更新时间:2023-10-29 17:17:57 28 4
gpt4 key购买 nike

是否可以在运行时动态加载 Django 应用程序?通常,应用程序在初始化时加载,使用 settings.py 中的 INSTALLED_APPS 元组。但是,是否可以在运行时加载其他应用程序?我在不同的情况下遇到这个问题。例如,一种情况是在测试期间出现的,当时我想动态加载或卸载应用程序。

为了使问题更具体,假设我有一个名为 apps 的目录,我将我的应用程序放在其中,并且我想自动安装进入该目录的任何新应用程序而无需手动编辑设置.py.

这很简单。按照

中的示例代码

Django: Dynamically add apps as plugin, building urls and other settings automatically

我们将以下代码放在 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 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,即从我的项目导入设置

然后在任何 app 目录更改后使用 python 内置命令重新加载 settings。尽管 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.8 更新

from collections import OrderedDict
from django.apps import apps
from django.conf import settings
from django.core import management

new_app_name = "my_new_app"

settings.INSTALLED_APPS += (new_app_name, )
# To load the new app let's reset app_configs, the dictionary
# with the configuration of loaded apps
apps.app_configs = OrderedDict()
# set ready to false so that populate will work
apps.ready = False
# re-initialize them all; is there a way to add just one without reloading them all?
apps.populate(settings.INSTALLED_APPS)

# now I can generate the migrations for the new app
management.call_command('makemigrations', new_app_name, interactive=False)
# and migrate it
management.call_command('migrate', new_app_name, interactive=False)

关于python - 在运行时动态加载 Django 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027901/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com