Django:"项目"与"应用程序"

Dol*_*lph 196 python django namespaces project-organization

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

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

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

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

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

cla*_*ion 90

一旦您使用毕业startprojectstartapp,没有什么可以从同一个Python包结合"项目"和"应用"阻止你.一个项目实际上只不过是一个settings模块,一个应用程序实际上只不过是一个models模块 - 其他一切都是可选的.

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

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py
Run Code Online (Sandbox Code Playgroud)

  • +1摘要:项目有settings.py,app有models.py.它们是同一级别的结构.我曾经认为项目比app高一级,我猜错了 (18认同)
  • @claymation ,为了允许“python manage.py makemigrations”或“python manage.py migrate”查看“我的产品”目录中的“models.py”文件,应该在设置(作为应用程序)中包含什么? (2认同)

Ski*_*Ski 69

尝试回答问题:"我的申请做了什么?".如果你不能用一个句子回答,那么也许你可以将它拆分成几个具有更清晰逻辑的应用程序.

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

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

  • +1遵循unix哲学:http://www.faqs.org/docs/artu/ch01s06.html (11认同)
  • 在铺设我自己的应用程序时,我仍然在苦苦挣扎.我觉得我的主要应用程序有点沉重,但与此同时,我无法将其重构为任何接近于类似松散耦合的东西.我倾向于认为如果我的主要主要实体之间存在分离,如果它们仍然相互依赖,并且没有必要重复使用或推广,那么这并不是一个改进.我倾向于"不要过早地重构"作为"不要过早优化"的解释 (8认同)

小智 56

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

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py
Run Code Online (Sandbox Code Playgroud)

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

现在,你应该怎么做?或者说,我该怎么做?好吧,如果你创建一个显著一块可重复使用的功能,好比说一个标记编辑器,当你创建一个"顶级应用程序",它可能包含是widgets.py,fields.py,context_processors.py你可能希望所有的东西导入-等.

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

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

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

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

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

  • +1 ......"什么阻止你使用myproduct.myproduct?" - 我认为,Django的"startapp"命令实际上阻止了你作为一种约定.我喜欢惯例,特别是在团队努力的背景下,但我更喜欢理解它们背后的逻辑:) (24认同)

Joo*_*ing 15

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

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


cro*_*jer 8

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

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

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

在一般的django项目中,有许多应用程序(contrib应用程序)可以在每个项目中使用.

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

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

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

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