Django文件夹结构问题

时间:2012-11-25 08:51:58

标签: python django

来自Apache / php世界,我无法找到搜索django开发最佳实践的东西:

使用symfony2框架(甚至是Java Play!),您总是有一个“公共”文件夹,而网络服务器只提供此文件夹中的文件。出于安全原因的明显策略在开发过程中也很清楚将公共文件放在此文件夹中。

在django中根本不清楚:从我的阅读中看,在根级别拥有静态文件夹似乎是一个好习惯PLUS UGC文件的媒体文件夹和àtemplate文件夹。没有主要的“公共”文件夹。

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

2 个答案:

答案 0 :(得分:3)

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

  1. 捆绑资源/资产与应用程序(通常是css,javascript)
  2. 您的用户上传的所有文件。
  3. 由于这些是两种不同类别的静态文件,因此django提供了两种处理它们的机制。由于第一个比第二个更常见(您可能没有要求用户上传文件的应用程序),因此使用django内置了处理第一个条件。

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

    完成此操作后,collectstatic命令将收集所有静态文件(来自static中所有应用程序中的INSTALLED_APPS子目录以及STATICFILES_DIRS中的任何目录并将它们放在STATIC_ROOT指向的目录中;这样{{ STATIC_URL }}标记在模板中正常工作。

    现在,您所做的只是移动/指向/链接STATIC_ROOT目录,以便可以从Web访问。 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中被隔离。

答案 1 :(得分:0)

您可以使用命令

将所有静态资源复制到公共/静态文件夹中
> python manage.py collectstatic

如果您在manage.py中设置了静态路径

STATIC_ROOT =“〜/ mypath / public / static /”

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