2012-11-25 45 views
1

从Apache/PHP的世界即将有件事我无法弄清楚寻找Django开发最佳实践:(!或连渣播放)Django的文件夹结构问题

随着Symfony2的框架,你总是有一个“公共“文件夹和网络服务器仅从该文件夹提供文件。明显的安全策略策略在开发过程中将公共文件放入此文件夹中也很明显。

在django中根本看不清楚:从我的阅读中看,在根级别上有一个静态文件夹PLUS用于UGC文件和à模板文件夹的媒体文件夹是一种很好的做法。没有主要的“公共”文件夹。

有人能帮我清理一下吗?让一个文件夹包含所有请求并保护应用程序的其余部分会更安全吗?

坦克

回答

3

django中有两种不同类型的“静态”文件。

  1. 捆绑资源/资产与应用(CSS,JavaScript的典型值)
  2. 任何文件上传您的用户。

由于这些是两个不同类别的静态文件,django提供了两种处理它们的机制。由于第一种情况比第二种情况更常见(您可能没有需要用户上传文件的应用程序),因此使用django构建处理第一种情况的方法。

根据标准布局,需要静态文件的应用程序将把它们包含在应用程序目录中名为static的目录中。 Django将在静态文件的INSTALLED_APPS的任何应用程序内搜索此目录。如果您的文件与任何应用程序无关,您可以将它们放在单独的目录中。这个目录应该被添加到STATICFILES_DIRS(一个元组),所以django知道它。

一旦你做到了这一点,该collectstatic命令将收集所有的静态文件(从在INSTALLED_APPS和所有的应用程序在任何STATICFILES_DIRS目录下的子目录static),并把它们放到一个目录指向STATIC_ROOT;这是如此{{ STATIC_URL }}标签在模板中正常工作。

现在,你所做的只是移动/点/链接STATIC_ROOT目录,以便它可以从网页访问。 Django预计STATIC_ROOT中的所有文件都可以通过STATIC_URL指定的根URL访问。


对于用户上传的文件,django比较省心。所有它真正关心的是,不要将用户上传的文件放在与collectstatic命令将用于读取其文件相同的位置 - 这意味着MEDIA_ROOT不能是STATICFILE_DIRS的目录或子目录(如果您有在这里指定任何目录,通常这个设置在vanilla django设置中是未定义的)。

MEDIA_ROOT是一个django可以通过在根目录下创建子目录来操作的目录(例如参见FileField documentation)。

MEDIA_URL是指向用户上传文件的根目录的URL前缀。这使得为​​模型生成自动URL的命令可以正常工作。


由于这些是两个不同类别的静态文件,因此存在两种不同类型的安全和部署要求。例如,您可能希望将用户上传的文件存储在S3存储桶中,但将应用程序的资产存放在其他位置。

这就是为什么这两个类似的东西在django中隔离。

0

您可以将所有静态资源复制到一个公用/静态文件夹用命令

> python manage.py collectstatic 

提供您已在manage.py

STATIC_ROOT设置一个静态路径= “〜/ mypath/public/static /”

每个应用程序都应该有自己的静态资产。

+0

你会说媒体文件夹应该在公共场所吗?为了安全起见,我应该在一个文件夹中包含所有公共文件?就像它在Apache/PHP世界中一样? – Matthieu