什么时候在 Django 中创建一个新的应用程序?

我已经为此四处搜索过了,但我仍然难以理解 Django 所定义的“应用程序”。

我是否应该为站点中的每个功能部分创建一个新的应用程序,即使它使用来自主项目的模型?

你们有没有一个很好的经验法则,什么时候拆分一个新的应用程序,什么时候保持功能与“主项目”或其他应用程序一起?

37178 次浏览

我倾向于为每一组逻辑上独立的模型创建新的应用程序。例如:

  • 用户简介
  • 论坛帖子
  • 博客文章

我更喜欢将 Django 应用程序看作可重用的模块或组件,而不是“应用程序”。

这有助于我封装和解耦特定的功能,提高可重用性,如果我决定与整个社区共享一个特定的“应用程序”,以及可维护性。

我的一般方法是将特定的功能或特性集装进“应用程序”中,就好像我要公开发布它们一样。最难的部分是计算出每个桶有多大。

我使用的一个很好的技巧是想象如果我的应用程序被公开发布,它们将如何被使用。这经常鼓励我缩小桶,并更清楚地定义它的“目的”。

James Bennett 有一个关于如何在 Django 中组织可重用应用程序的很棒的 一组幻灯片

一个“应用程序”可以是许多不同的东西,这一切都归结为品味。例如,假设您正在构建一个博客。你的应用程序可以是整个博客,或者你可以有一个“管理”应用程序,一个“网站”应用程序的所有公众意见,一个“ rss”应用程序,一个“服务”应用程序,这样开发人员可以用他们自己的方式与博客接口,等等。

我个人会将博客本身作为应用程序,并突破其中的功能。这个博客可以很容易地在其他网站上重用。

Django 的优点在于,它可以将目录树的任何级别中的任何 models.py 文件识别为包含 Django 模型的文件。因此,将你的功能分解成更小的“子应用程序”并不会让任何事情变得更困难。

我遵循的规则是,如果我想在不同的项目中重用这些功能,它应该是一个新的应用程序。

如果需要深入理解项目中的模型,那么将它与模型结合起来可能更有凝聚力。

以下是2008年9月6日的最新简报。

DjangoCon 2008: 可重用应用程序@7:53

幻灯片: 可重用 _ apps. pdf

从幻灯片上取下来的

这应该是它自己的应用程序吗?

  • 它是否与应用程序的焦点完全无关?
  • 它和我做的其他事情是正交的吗?
  • 我需要在其他网站类似的功能?

如果他们中的任何一个是“是的”? 那么最好把它分解成一个 单独申请。

对于这个问题,我在网上找到的两个最佳答案是:

  1. 可重用应用程序讲座(幻灯片)(视频)也在其他答案中提到。Bennett 是作者和 Django 的撰稿人,他定期发布应用程序供其他人使用,并对许多小型应用程序持有强烈的观点。
  2. Doordash’s Tips for Django at Scale 给出了相反的建议,并说在他们的案例中,他们在开始使用许多不同的应用程序之后迁移到了一个单独的应用程序。他们遇到了应用程序之间迁移依赖关系图的问题。

双方都同意在下列情况下应该创建一个单独的应用程序:

  • 如果您计划在另一个 Django 项目中重用您的应用程序(特别是如果您计划发布它以供其他人重用)。
  • 如果应用程序与另一个应用程序之间很少或没有依赖关系。在这里,你可以想象将来一个应用程序作为自己的微服务运行。

这个问题的最佳答案来自 Andrew Godwin (Django 核心开发人员) :

在我看来,应用程序的主要目的是提供可重用组件的逻辑分离——具体来说,就是为模型/管理员等提供一个一流的名称空间——并提供一种简单的方法来打开或关闭组件。

在某种程度上,它是创建 Django 时的遗物——当时 Python 打包和模块还没有得到很好的开发,您基本上必须拥有自己的解决方案来解决这个问题。尽管如此,它仍然是 Django 思维模型的核心部分,而且我认为 INSTALLED _ APPS 仍然是一个比 Python 提供的入口点替代方案更简洁、更容易的解决方案(这使得禁用安装在环境中但你不想使用的包变得相当困难)。

你认为现在有什么特别的东西可以与应用程序的概念解耦吗?模型和管理员需要它来进行自动发现和一个独特的名称空间前缀,所以这很难撤销,而且我正在努力思考你需要它的其他特性(事实上,如果你想要的只是一个库,你可以把它变成一个普通的 Python 库——不需要应用程序包装,除非你发送模型、模板或管理代码 IIRC)