如何使用生命周期创建Django应用程序?

时间:2011-09-22 12:23:24

标签: django lifecycle

我们正在开发一个关于Django的庞大应用程序包含许多依赖于它们之间的应用程序。我们希望为应用程序实现生命周期(安装,加载,卸载,卸载),因为它必须具有功能(部署后);是否存在任何框架或包?

实施此方法的最佳方法是什么?

由于

1 个答案:

答案 0 :(得分:0)

看起来你想在Django中复制其他流行语言和框架的功能。想起你的职位OSGi,请记住。

问题是99,9%的Django应用程序不是“动态的”,因为应用程序可以在运行时安装,加载,卸载和卸载。这不是Django应用程序的工作方式。您在应用程序启动之前安装应用程序。要卸载应用程序,请关闭应用程序并将其从INSTALLED_APPS(settings.py)列表中删除。由于这不会在运行时发生,因此Django应用程序不会有任何信号,回调或其他内容。

但是你可以做一些事情来至少满足你的一些需求。从我的头脑中,我认为你可以做一些像before_installafter_install“信号”(不是在Django信号意义上)。

为此,您可以编写某种“控制器”或“注册表”应用程序。一个用于before_install,一个用于after_install代码。这些应用会在INSTALLED_APPS中的其他应用之前和之后进行。

e.g。

INSTALLED_APPS = (
    # all the Django apps and other third party apps
    'before_install_controller_app',
    # all your in-house apps
    'after_install_controller_app',
)

这两个应用程序会迭代INSTALLED_APPS下列出的所有应用。他们尝试从每个应用程序导入特定的python文件。如果该文件不在应用程序中(因为它是Django或第三方应用程序)没有任何反应。但如果有文件,我们称之为before_install.pyafter_install.py加载它并运行内部代码。

同样适用于after_install_controller_app应用,但它会寻找after_install.py

它与Django用于管理员的机制基本相同。管理员应用程序会迭代所有应用并尝试导入admin.py。这就是为什么你应该首先看一下相应的Django source。它非常直接且易于理解。我做了类似的事情,它就像一个魅力。

当然有一些限制。例如:

  • before_install.py代码无权访问基础应用程序的数据库模型,因为它们可能是a)尚未创建(请参阅应用程序的顺序)或b)已过期。
  • 我相信还有更多,但目前我还没有找到。

最后一件事:

不要试图将一种编程语言/框架的功能/范例映射/移植到另一种编程语言/框架。可能存在根本的差异,使得一种语言/框架中的好方法在另一种语言/框架中无用。这似乎就是这种情况。

如果您还有其他问题,如果可以,我会很乐意提供帮助。