当前位置: 首页 > 面试题库 >

在运行时动态加载Django应用

汪凌
2023-03-14
问题内容

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

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

这很容易。遵循示例代码

Django:动态添加应用程序作为插件,自动构建网址和其他设置

我们将以下代码放入其中,settings.py从而可以遍历app目录中所有子目录的名称,并像这样增加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无效。

我想知道的是,是否有我可以做的事情–无需重启-重新加载设置并加载/安装新应用。

我试图直接导入my settings.py,即从myproject导入设置导入

然后reloadsettings使用任何之后的蟒蛇内置app目录更改。尽管settings.INSTALLED_APPS现在已更改为包括新添加的应用程序,但这最终没有任何区别。例如,

from django.db import models
models.get_apps()

仅显示原始应用apps,而不显示新添加的应用,同样

management.call_command('syncdb', interactive=False)

将不会看到新添加的应用。

如前所述,我在考虑动态添加或删除应用程序的测试中会考虑这种情况。


问题答案:

要回答我自己的问题…

尽管我没有针对此问题的完全通用的解决方案,但我确实有一个足以在测试期间动态加载应用程序的解决方案。

继续上面的示例,如果我在django shell中,并且想要添加并加载一些添加到apps目录中的新应用程序,则可以

import os
from django.conf import settings
from django.db.models import loading
from django.core import management

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 settings.INSTALLED_APPS:
        settings.INSTALLED_APPS += (app_name, )

接着

loading.cache.loaded = False
management.call_command('syncdb', interactive=False)


 类似资料:
  • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法一样容易的事情来说是很多工作。 对执行此操作的简单代码有何建议? 问题答案: 很难的原因是安全性。类加载器是不可变的。你不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。

  • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法那样容易的事情来说是很多工作。 问题答案: 很难的原因是安全性。类加载器是不可变的。您不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。这是制作自己的子类加载器的方法:

  • 问题内容: 我的机器上有一个jvm服务器,现在我想在同一台机器上有2个我的apserver,但是我希望备用服务器分配给xmx的内存非常少,因为它的被动服务器是主服务器(主动服务器) )掉了,我想给没有启动的被动服务器分配更多的内存,而无需重启它(我让它们的xmx都太多了- 请注意,它们会在启动时消耗内存,并且我不允许outOfMemory的可能性)。 所以我要被动-低xmx,一旦主动下降,我希望我

  • 问题内容: 当Django启动时,如何从mysql数据库加载资源并将其放入内存(Redis)中,以供所有应用程序使用。 我已经看到了这个 [https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready] 但是他们提到在ready函数中不使用db连接。我的网站启动时该怎么办? 我还可以在read

  • 问题内容: 我试图在运行时将jar文件添加到classpath。我用这个代码 系统输出打印此URL: 我正在仔细检查此路径,此jar存在。即使这个测试也显示com.mysql.jdbc。驱动程序类存在。 但是,当我使用此Class.forName(driver)时,仍然会收到java.lang.ClassNotFoundException。此代码有什么问题? 问题答案: URL可以,但是您仍然尝试

  • 问题内容: 我需要动态加载React组件。 我从用户获取要加载为字符串的组件名称。我正在使用 webpack 。 如何动态加载组件,而不要使用静态import语句。似乎不评估表达式。我想要实现的是这样的事情。 但这似乎不起作用。 问题答案: 基本上,它可以归结为预先创建您将需要的所有块。然后,您只需要一种动态引用它们的方法。这是我基于的解决方案: http://henleyedition.com/