2012-02-02 40 views
6

我正在计划一个新的Django项目,并希望获得一切正确和东西。我偶然发现如何组织项目目录布局的问题。幸运的是,网上有很多好的项目模板的例子。尽管如此,还有一件事我很难理解:Django中的模板和静态文件的位置

这是将模板文件放入项目根目录下的推荐方式,该项目根目录由应用程序划分为子目录。所以,模板不在应用程序目录中。这对我来说似乎合乎逻辑,因为我们要将应用程序逻辑与表示逻辑分开。但是静态文件呢?在这里,通常的做法似乎是将静态文件放在应用程序目录中,并在开发时将它们加载到项目根目录下的静态目录(collectstatic)中。而这个逻辑我不明白。由于静态文件(即js,css,图像)通常在模板中访问,而不是在应用程序代码中访问,所以我会将它们计算为表示逻辑。那为什么他们不像模板那样存储 - 项目根目录下的一个目录,以及单个应用程序的子目录?

我知道我可以将这些文件存储在任何我想要的地方,但我想这可能是人们为什么这样做的一个很好的理由。这是什么原因?

回答

8

静态文件可以放在相关应用程序中,其方式与通常将与特定应用程序相关的模板放在应用程序目录中的方式相同。

有时候,这是有道理的。有时候,它不是 - 这是你的电话。例如,我将我的静态媒体放在site_media目录(全局css,全局图像等)中,但将应用特定媒体放在app/static中。例如,如果我有一个Poll应用程序,很可能我的媒体仅用于投票应用程序模板,而不是我的网站索引。

这同样适用于模板:我将全局模板(base.html)放在全局模板目录中,但应用程序特定的模板放在myapp/templates/myapp/foo.html中。

最后,它对可插拔应用程序特别有意义。例如,django的静态文件存储在应用程序中,但即使应用程序驻留在python路径的某处,您的静态文件目录也可以访问该文件。以前,您将不得不将媒体目录或符号链接复制到它。

静态文件应用程序真的很闪亮,因为它可以让你在一个地方组织应用程序文件夹:所有与应用程序相关的文件collectstatic负责其余部分,并在一个位置为Web服务器提供全部功能。

+0

我发现在应用程序目录中组织模板和静态文件对于可插入应用程序来说很合理。但是,如果我不打算创建可插拔应用程序,没有任何好处,不是吗?每次部署我的项目的新版本时,我只需要调用'collectstatic'的开销。 – j0ker 2012-02-03 17:15:47

+0

@ J0ker,这是可辩论的,完全是你的呼叫。有时,如果它是一个独立打包的应用程序,我发现自己使用'app/static'。其他时候,对于一组与所有核心网站相关的应用程序,我只需使用我的'site_media'文件夹。调用“collectstatic”的开销因为我使用无论如何使用它的结构脚本而被移除。 PLUS <如果您配置了staticfiles存储后端,您可以将collectstatic上传到amazon S3非常有用。 – 2012-02-03 17:46:43

5

我实际上把模板放在每个应用程序的目录中,我认为它是有道理的。由于其他所有内容都发生在Python文件中,因此您仍然有逻辑分离的分离。

但是,将模板目录放在应用程序中意味着如果结果显示该应用程序对其他项目很有用,则可以将应用程序直接复制到新项目。而且您始终可以通过在根模板文件夹中创建替代模板来覆盖这些模板。

这就是为此,静态目录应该被存储在应用程序目录;它允许您根据特定应用程序的需要非常清楚地组织资源,这就是staticfiles应用程序首先创建的原因。