Django中模板和静态文件的位置

7
我正在计划一个新的Django项目,并希望做到一切都正确。我遇到了如何组织项目目录结构的问题。幸运的是,网络上有很多好的项目模板示例。尽管如此,有一件事我仍然难以理解:
建议将模板文件放在项目根目录下的一个单独目录中,该目录按应用程序分成子目录。因此,模板不在应用程序目录中。这对我来说似乎很合乎逻辑,因为我们要将应用程序逻辑与表示逻辑分开。但是静态文件呢?在这里,通常的做法似乎是将静态文件放在应用程序目录中,并在开发时将它们加载到项目根目录下的“static”目录中(collectstatic)。但是我不理解这种逻辑。由于静态文件(即js、css、图像)通常是在模板中访问,而不是在应用程序代码中访问,所以我会将它们归类为表示逻辑。那么为什么它们不能像模板一样被存储 - 在项目根目录下的一个目录中,为单个应用程序分配子目录?
我知道我可以将这些文件存储在任何地方,但我想知道人们这样做的好理由是什么。这个原因可能是什么?
2个回答

9
静态文件可以以与特定应用程序相关的方式放置在应用程序目录中,就像与特定应用程序相关的模板通常放置在应用程序目录中一样。
有时候是有意义的,有时候则不是 - 这取决于你的选择。
例如,我将我的静态媒体放在一个名为“site_media”的目录中(全局css、全局图片等),但将特定于应用程序的媒体放在“app/static”中。例如,如果我有一个“Poll”应用程序,我的媒体很可能只需要用于Poll应用程序模板,而不是我的站点索引。
同样适用于模板:我将我的全局模板(base.html)放在全局模板目录中,但特定于应用程序的模板放在“myapp/templates/myapp/foo.html”中。
最后,对于可插拔应用程序来说,这确实是有意义的。例如,django的静态文件存储在应用程序中,即使应用程序位于python路径的某个位置,也可以在您的静态文件目录中访问。以前,您必须复制媒体目录或建立符号链接。
staticfiles应用程序真正闪耀的地方在于它可以让您将与应用程序相关的所有文件组织在一个地方:应用程序文件夹中。collectstatic会处理其余部分,并使其在一个位置为Web服务器提供。

我发现在应用程序目录中组织模板和静态文件对于可插拔应用程序是有意义的。但是,如果我不打算创建可插拔应用程序,那么就没有任何好处了,是吗?我只需要在每次部署项目的新版本时调用collectstatic会增加一些额外的工作量。 - j0ker
@J0ker,这是有争议的,完全取决于你。有时,如果它是一个离散打包的应用程序,我会使用app/static。其他时候,对于一组与核心网站相关的应用程序,我只使用我的site_media文件夹。由于我使用一个使用它的面料脚本,因此调用“collectstatic”的开销被删除了。此外,如果配置了静态文件存储后端,则可以让collectstatic上传到Amazon S3非常有用。 - Yuji 'Tomita' Tomita

5
我实际上将模板放在每个应用程序的目录中,我认为这是有意义的。由于其他所有操作都在Python文件中进行,因此您仍然具有逻辑分离。
然而,将模板目录放在应用程序中意味着,如果该应用程序对其他项目有用,则可以直接将该应用程序复制到新项目中。并且,您始终可以通过在根模板文件夹中创建替代模板来覆盖这些模板。
正是出于这个原因,静态目录也应该存储在应用程序目录中;它允许您根据特定应用程序所需的资源非常清晰地组织资源,这也是为什么首先创建了staticfiles应用程序的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接