我刚刚开始学习Django,并且对布局和组织项目和应用程序的最佳方式感到有些困惑。根据我的理解,项目是整个网站,应用程序是构成该网站的部分吗?
对于第一个项目,我正在建立一个小型的电子商务类型网站,其中包含用户,项目等......那么我应该拥有“用户”和“项目”应用程序吗?与用户注册/登录,项目标签,项目评论等较小的部分相比如何呢?用户身份验证,标记和评论是否应该是单独的应用程序?
基本上我无法绕过应用程序的概念以及何时将不同的用例分成单独的应用程序,同时保持一切可管理和干燥。
答案 0 :(得分:18)
Ignacio指出你提到的一些应用程序已经存在是正确的。您还应该查看像Pinax这样的项目,以查找可以作为您自己项目的起点的其他可插拔应用程序。
现在回答你的问题:Django项目是Django应用程序的集合 - 你正确的部分。 Django book更好地定义了它:
“项目是Django实例的设置集合,包括数据库配置,Django特定选项和特定于应用程序的设置。”
django book defines a Django app为:
“一组Django代码,包括模型和视图,它们共存在一个Python包中,代表一个完整的Django应用程序。”
但在最近的Jacob Kaplan-Moss课程中,我理解(请注意,我并不是说这就是他所说的!!!) 一个Django应用程序是关于封装公共定义良好的行为 即可。我也明白 有很多小应用程序可以 - 比拥有一个可以完成所有工作的单一应用程序更好 - 而且有些应用程序只是提供模板,有些只是模型,一些完整的模板,模型和视图集合。
我的大多数项目 - 这是我们公司的内部应用程序 - 都有一个内部开发的通用可插拔应用程序,它几乎是模板,CSS,JavaScript等的集合;将项目与一个共同的外观和感觉联系在一起。我在该可插拔应用程序中没有任何视图或模型。
我有一个可插拔的应用程序,也是内部开发的,包含一组在多个项目之间共享的模型。这些模型代表了几个不同应用程序使用的常见数据库表,并将它们复制到每个应用程序中violate DRY。
应用程序的一些好例子:
以上所有都解决了一个逻辑问题。他们不会尝试成为一个全能的解决方案... Gravatar应用程序不提供OpenID支持(还有另一个OpenID应用程序),而我的帮助台内部应用程序不提供身份验证(它使用默认的django应用程序)。
Django应用程序的一个不好的例子是实现身份验证,openid支持,帮助台和项目跟踪的应用程序。为什么会那么糟糕?因为现在如果你想重用你的身份验证应用程序,你必须从一些无所不包的应用程序中解放一些模型,一些视图,一些模板。如果您认为OpenId支持是下一个项目必须的,那么您将需要查看应用程序的这个庞然大物的代码并找出哪些部分是相关的。
一个好的Django应用程序提供了一组逻辑操作并且做得很好。