215

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

项目可以有许多应用程序。应用程序可以在许多项目之间共享。美好的。

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

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

我希望有一个通用的解决方案...

4

6 回答 6

102

一旦你不再使用startprojectand startapp,没有什么可以阻止你在同一个 Python 包中组合“项目”和“应用程序”。一个项目实际上只不过是一个settings模块,而一个应用程序实际上也只不过是一个models模块——其他一切都是可选的。

对于小型网站,完全合理的做法是:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py
于 2013-03-15T14:58:37.667 回答
70

尝试回答问题:“我的应用程序是做什么的?”。如果你不能一句话回答,那么也许你可以把它分成几个逻辑更清晰的应用程序。

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

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

于 2011-02-02T20:01:03.710 回答
58

是什么阻止你使用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),它将被处理。就那么简单。所有这些“项目”/“应用程序”的东西都只是 python 包。

现在,你应该怎么做?或者更确切地说,我该怎么做?好吧,如果您创建了一个重要的可重用功能,例如标记编辑器,那么您就可以创建一个“顶级应用程序”,其中可能包含widgets.py,fields.pycontext_processors.py- 您可能想要导入的所有内容。

类似地,如果您可以以一种在安装中非常通用的格式创建类似于博客的东西,您可以将其包装在一个应用程序中,使用它自己的模板、静态内容文件夹等,并配置一个 django 项目的实例以使用它应用程序的内容。

没有硬性规定必须这样做,但这是框架的目标之一。事实上,包括模板在内的所有内容都允许您从一些公共基础中包含在内,这意味着您的博客应该紧贴任何其他设置,只需照顾好它自己的部分。

但是,为了解决您的实际问题,是的,没有什么说您不能使用顶级项目文件夹。这就是应用程序所做的事情,如果您真的愿意,您可以这样做。然而,我倾向于不这样做,原因如下:

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

简而言之,存在约定的原因与任何其他约定相同——当涉及到与您的项目一起工作的其他人时,它会有所帮助。如果我看到fields.py我会立即期望其中的代码继承 django 的字段,而如果我看到inputtypes.py我可能不看它就不太清楚这意味着什么。

于 2011-02-02T19:58:21.073 回答
15

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

原则上,您可以在 django 中自由地组织产品的源代码。

于 2011-02-02T19:54:31.380 回答
8

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

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

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

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

假设您的项目只执行一项任务并且只有一个应用程序(我将其命名main为项目围绕它旋转并且几乎不可插拔)。这个项目通常也仍然使用一些其他的应用程序。

现在,如果您说您的项目仅使用一个应用程序 ( INSTALLED_APPS='myproduct') 那么project将项目定义为 有什么用project.app,我认为您应该考虑以下几点:

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

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

于 2011-02-02T21:22:37.010 回答
2

在这里,Django 创建者自己指出了这种差异。我认为考虑应用程序,因为它们必须在其他项目中可重用是好的。Django 中的应用程序也是一种很好的思考方式,它提供了现代 Web 应用程序。

想象一下,您正在创建基于JavaScript的大型动态Web 应用程序。

然后,您可以在名为“FrontEnd”的 django 应用程序中创建 <--在 Thins 应用程序中,您将显示内容。

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

In this way you can always reuse your "Comments" app. You can make it open source without opening source of whole project. And you keep clean logic of your project.

于 2017-12-05T10:33:20.317 回答