我们正在开发一个关于Django的庞大应用程序包含许多依赖于它们之间的应用程序。我们希望为应用程序实现生命周期(安装,加载,卸载,卸载),因为它必须具有功能(部署后);是否存在任何框架或包?
实施此方法的最佳方法是什么?
由于
答案 0 :(得分:0)
看起来你想在Django中复制其他流行语言和框架的功能。想起你的职位OSGi,请记住。
问题是99,9%的Django应用程序不是“动态的”,因为应用程序可以在运行时安装,加载,卸载和卸载。这不是Django应用程序的工作方式。您在应用程序启动之前安装应用程序。要卸载应用程序,请关闭应用程序并将其从INSTALLED_APPS
(settings.py)列表中删除。由于这不会在运行时发生,因此Django应用程序不会有任何信号,回调或其他内容。
但是你可以做一些事情来至少满足你的一些需求。从我的头脑中,我认为你可以做一些像before_install
和after_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.py
并after_install.py
加载它并运行内部代码。
同样适用于after_install_controller_app
应用,但它会寻找after_install.py
。
它与Django用于管理员的机制基本相同。管理员应用程序会迭代所有应用并尝试导入admin.py
。这就是为什么你应该首先看一下相应的Django source。它非常直接且易于理解。我做了类似的事情,它就像一个魅力。
当然有一些限制。例如:
最后一件事:
不要试图将一种编程语言/框架的功能/范例映射/移植到另一种编程语言/框架。可能存在根本的差异,使得一种语言/框架中的好方法在另一种语言/框架中无用。这似乎就是这种情况。
如果您还有其他问题,如果可以,我会很乐意提供帮助。