Django:“项目”与“应用程序”

时间:2011-02-02 19:41:50

标签: python django namespaces project-organization

我有一个相当复杂的“产品”我正准备使用Django构建。在这种情况下,我将避免使用术语“项目”和“应用程序”,因为我不清楚它们在Django中的具体含义。

项目可以有很多应用。应用程序可以在许多项目之间共享。细

我没有重新发明博客或论坛 - 我没有看到我的产品的任何部分在任何情况下都可以重复使用。直觉上,我称之为“应用程序”。然后,我是否在一个“app”文件夹中完成所有工作?

如果是这样 ...就Django的project.app命名空间而言,我倾向于使用myproduct.myproduct,但当然这是不允许的(但是应用程序我'building是我的项目,我的项目是一个应用程序!)。因此我相信也许我应该通过为每个“重要”模型构建一个应用程序来接近Django,但我不知道在我的模式中绘制边界的位置将其分成应用程序 - 我有很多关系相对复杂的模型。

我希望有一个共同的解决方案...

6 个答案:

答案 0 :(得分:87)

从使用startprojectstartapp毕业后,没有什么可以阻止您在同一个Python包中组合“项目”和“应用程序”。一个项目实际上只是一个settings模块,一个应用程序实际上只是一个models模块 - 其他一切都是可选的。

对于小型网站,如下所示是完全合理的:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py

答案 1 :(得分:66)

  

尝试回答问题:“我的是什么   申请吗?“。如果你不能回答   用一句话,也许你可以   用清洁剂将它分成几个应用程序   逻辑。

在我开始使用django之后不久我就读到了这个想法,我发现我经常问这个问题,这对我很有帮助。

您的应用不必是可重复使用的,它们可以相互依赖,但它们应该做一件事。

答案 2 :(得分:55)

什么阻止您使用myproduct.myproduct?您需要实现的目标大致包括:

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py

等等。如果我说views.py不必被称为views.py,会有帮助吗?如果你可以在python路径上命名一个函数(通常是package.package.views.function_name),它将被处理。就那么简单。所有这些“项目”/“app”的东西都只是python包。

现在,你应该怎么做?或者说,我该怎么做?好吧,如果您创建了一个重要的可重用功能,比如说标记编辑器,那就是当您创建可能包含widgets.pyfields.pycontext_processors.py等的“顶级应用”时 - 您可能想要导入的所有内容。

同样,如果您可以在安装过程中以非常通用的格式创建类似博客的内容,则可以将其打包在具有自己的模板,静态内容文件夹等的应用程序中,并配置django项目的实例使用该应用程序的内容。

没有严格的规则说你必须这样做,但这是框架的目标之一。事实上,所有内容,包括模板,允许您从一些共同基础包含意味着您的博客应该适合任何其他设置,只需照顾自己的部分。

但是,为了解决您的实际问题,是的,没有任何说明您无法使用顶级项目文件夹。 这就是应用所做的,如果你真的想要,你可以做到。但是,我倾向于出于以下几个原因:

  • Django的默认设置不会这样做。
  • 通常,我想创建一个主应用程序,所以我创建一个,通常称为website。但是,在以后我可能想要为此站点开发原始功能。为了使它可移动(无论我是否做过),我倾向于创建一个单独的目录。这也意味着我可以通过从配置中取消链接并删除文件夹来删除所述功能,而不是从全局urls.py文件夹中删除正确的URL。
  • 很多时候,即使我想要独立制作某些东西,它也需要在某个地方生活,同时我会照顾它/使它独立。基本上是上面的情况,但对于我打算制作通用的东西。
  • 我的顶级文件夹通常包含一些其他内容,包括但不限于wsgi脚本,sql脚本等。
  • django的management extensions依赖于子目录。因此,适当地命名包是有意义的。

简而言之,存在约定的原因与任何其他约定相同 - 当涉及到处理项目的其他人时,它会有所帮助。如果我看到fields.py我立刻希望它中的代码继承django的字段,而如果我看到inputtypes.py我可能不会那么清楚这意味着什么,而不是看它。

答案 3 :(得分:15)

我发现以下博客文章对django应用程序和项目非常有用:

原则上,您可以通过django自由组织产品的源代码。

答案 4 :(得分:8)

  

如果是这样......就Django的project.app命名空间而言,我倾向于使用product产品.myproduct,但当然不允许这样做

没有什么不允许的。它是你的项目,没有人限制你。建议保留一个合理的名称。

  

我没有看到我的产品的任何部分在任何情况下都可以重复使用。直觉上,我称之为“应用程序”。然后,我是否在一个“app”文件夹中完成所有工作?

在一般的django项目中,有许多应用程序(contrib应用程序)在每个项目中都有用。

我们假设您的项目只执行一项任务,并且只有一个应用程序(我将其命名为main,因为项目围绕它而且很难插入)。该项目通常也会使用其他一些应用程序。

现在,如果你说你的项目只使用了一个应用程序(INSTALLED_APPS='myproduct'),那么使用project定义项目为project.app的是什么,我想你应该考虑一些问题:

  • 除了项目中的应用程序之外,还有许多其他代码处理(基本静态文件,基本模板,设置......即提供基础)。
  • 在一般的project.app方法中,django自动从模型中定义sql架构。
  • 使用传统方法构建项目会更容易。
  • 您可以根据需要为网址,视图和其他文件定义一些不同的名称,但我认为没有必要。
  • 您可能需要在将来添加一些应用程序,这对于传统的django项目来说非常简单,否则可能会变得同样或者更加困难和乏味。

就应用程序中的大多数工作而言,我认为大多数django项目都是如此。

答案 5 :(得分:1)

Here Django creators points out that difference themselves。 我认为,考虑到应用程序,因为它们必须可重复使用在其他项目中良好。另外,在Django中考虑应用程序的一种好方法是提供现代Web应用程序。

想象一下,您正在基于 JavaScript 创建大型动态网络应用。

您可以在django App中创建名为eg" FrontEnd" < - 在应用程序中,您将显示内容。

然后您创建一些后端应用程序。例如,应用名称"评论"这将存储用户评论。并且"评论"应用程序不会显示任何内容。它只是您动态 JS 网站的AJAX请求的API。

通过这种方式,您可以随时重复使用"评论"应用程序。您可以在不打开整个项目源的情况下使其成为开源。并保持项目的干净逻辑