何时在Django中创建一个新应用程序(使用startapp)?

时间:2008-09-15 16:03:23

标签: python django

我已经为此搜索了一下,但我仍然无法解释Django定义为“apps”的问题。

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

你们有什么经验法则可以解决何时拆分新应用,何时将功能与“主项目”或其他应用保持在一起?

8 个答案:

答案 0 :(得分:40)

James Bennett对如何在Django中组织可重用的应用程序有一个很棒的set of slides

答案 1 :(得分:18)

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

这有助于我将某些功能相互封装和分离,如果我决定与整个社区共享特定的“应用”并提高可维护性,则可以提高可重用性。

我的一般方法是将特定功能或功能集添加到“应用程序”中,就好像我要公开发布它们一样。这里的难点在于确定每个铲斗的大小。

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

答案 2 :(得分:12)

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

DjangoCon 2008: Reusable Apps @7:53

Slide: Reusable_apps.pdf

  

取自幻灯片

     

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

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

如果其中任何一个是“是”?然后最好把它打成一个   单独申请。

答案 3 :(得分:11)

我倾向于为每个逻辑上独立的模型集创建新的应用程序。 e.g:

  • 用户个人资料
  • 论坛帖子
  • 博客文章

答案 4 :(得分:5)

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

如果需要深入了解项目中的模型,那么坚持使用模型可能更具凝聚力。

答案 5 :(得分:1)

'app'可能有很多不同的东西,这一切都归结为品味。例如,假设您正在构建一个博客。您的应用可能是整个博客,或者您可以拥有一个“管理”应用,一个适用于所有公共视图的“网站”应用,一个“rss”应用,一个“服务”应用,因此开发人员可以在其中与博客进行交互自己的方式等。

我个人会将博客本身作为应用程序,并打破其中的功能。然后可以在其他网站上轻松地重复使用该博客。

关于Django的好处是,它会将目录树中任何级别的任何models.py文件识别为包含Django模型的文件。因此,将您的功能分解为“应用”本身内的较小“子应用”并不会让事情变得更加困难。

答案 6 :(得分:1)

我在网络上找到的对该问题的两个最佳答案是:

  1. 在其他答案中也提到了可重复使用的应用讨论(slides)(video)。作者和Django贡献者Bennett定期发布供他人使用的应用程序,并对许多小型应用程序有强烈的看法。
  2. Doordash's Tips for Django at Scale给出了相反的建议,并表示在从许多单独的应用程序开始之后,他们迁移到了一个应用程序。他们在应用之间的迁移依赖关系图中遇到了问题。

两个消息来源都同意您在以下情况下应创建一个单独的应用程序:

  • 如果您打算在另一个Django项目中重复使用您的应用程序(特别是如果您打算将其发布以供其他人重复使用)。
  • 该应用程序与另一个应用程序之间的依赖关系很少或没有。在这里,您也许可以想象一个应用程序将来会以其自己的微服务形式运行。

答案 7 :(得分:1)

这个问题的最佳答案是由Andrew Godwin(Django核心开发人员)给出的:

在我看来,应用程序的主要目的是提供可重用组件的逻辑隔离-特别是为model / admin / etc提供一流的名称空间。 -并提供一种简单的方法来“打开”或“关闭”。

从某种意义上讲,这是创建Django的遗物-Python封装和模块的开发远不如以前,您基本上必须有自己的解决方案。也就是说,它仍然是Django心理模型的核心部分,我认为INSTALLED_APPS还是比Python替代入口点的产品更干净,更容易的解决方案(这使得禁用安装在环境中的软件包非常困难,但是您却不愿意这样做)不想使用)。

您今天是否特别认为可以与应用程序概念脱节?模型和管理员需要它来进行自动发现和唯一的名称空间前缀,因此很难撤消,而且我正努力考虑您需要它的其他功能(实际上,如果您想要的只是一个库,您可以做到这一点一个普通的Python-除非您要运送模型,模板或管理代码IIRC,否则无需包装应用程序