如何创建具有生命周期的Django应用程序?

问题描述:

我们正在Django上开发一个庞大的应用程序,其中包含许多依赖于应用程序的应用程序。我们希望为应用程序实现一个生命周期(安装,加载,卸载,卸载),因为它必须具有功能(部署后);有没有框架或软件包存在?如何创建具有生命周期的Django应用程序?

实现此目的的最佳方法是什么?

感谢

+0

虽然这不是一个完整的答案,但我认为[林肯循环的最佳实践](http://lincolnloop.com/django-best-practices/)和配套应用程序[django-startproject](https:// github.com/lincolnloop/django-startproject)可能是很好的起点。 – Paolo

+0

感谢您的链接,我们已经为我们的应用程序提供了最佳/自定义模式。我们希望实现应用程序的生命周期。 – Sridher

+0

一个好的提示是,你总是可以让应用程序自己查看你的settings.INSTALLED_APPS的依赖关系,并在缺少某些东西时引发异常。如果你有一个策略让所有的应用程序拥有某种models.VERSION变量集,那么至少要确保没有部署无效的项目。如果您想安装,请尝试查看点以及如何添加维护自己的存储库。 – benjaoming

看起来要复制在Django其他流行的语言和框架的特点。阅读你的帖子OSGi的想法。

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

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

要做到这一点,你可以写一些“控制器”或“注册表”应用程序。一个用于before_install和一个用于after_install的代码。这些应用程序将位于INSTALLED_APPS的其他应用程序之前和之后。

例如

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代码将无法访问底层应用程序的数据库模型,因为他们可能是)没有尚未创建(见应用的顺序)或b)过时。
  • 我相信还有更多,但目前我没有找到更多。

在最后一件事:

不要试图努力的一个编程语言/框架/端口的功能/范式映射到另一个。在另一种语言/框架中可能存在根本的差异,使得一种语言/框架中的好方法无用。这当然是这种情况。

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