【问题标题】:Django folder structure issuesDjango文件夹结构问题
【发布时间】:2012-11-25 08:51:57
【问题描述】:

来自 Apache / php 世界,我无法弄清楚搜索 django 开发最佳实践:

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

在 django 中根本不清楚:根据我的阅读,在根级别有一个静态文件夹加上一个用于 UGC 文件的媒体文件夹和一个模板文件夹似乎是一种好习惯。没有主要的“公共”文件夹。

有人可以在这里帮我理清思路吗?让一个文件夹包含所有请求并保护应用程序的其余部分不是更安全吗?

坦克

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    1. 与应用程序捆绑在一起的资源/资产(通常是 css、javascript)
    2. 您的用户上传的任何文件。

    由于这是两种不同类别的静态文件,django 提供了两种机制来处理它们。由于第一个比第二个更常见(您可能没有需要用户上传文件的应用程序),处理第一个条件是 django 内置的。

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

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

    现在,您只需移动/指向/链接STATIC_ROOT 目录,以便可以从网络访问它。 Django 期望STATIC_ROOT 中的所有文件都可以通过STATIC_URL 指定的根URL 访问。


    对于用户上传的文件,django 更加轻松。它真正关心的是您不要将用户上传的文件放在与collectstatic 命令将用于读取其文件的位置相同的位置——这意味着MEDIA_ROOT 不能是@ 的目录或子目录987654336@(如果您在此处指定了任何目录,通常此设置在 vanilla django 设置中未定义)。

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

    MEDIA_URL 是指向用户上传文件根目录的 URL 前缀。这样,为模型生成自动 URL 的命令才能正常工作。


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

    这就是为什么这两个相似的东西在 django 中被隔离的原因。

    【讨论】:

      【解决方案2】:

      您可以使用命令将所有静态资产复制到公共/静态文件夹中

      > python manage.py collectstatic
      

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

      STATIC_ROOT = "~/mypath/public/static/"

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

      【讨论】:

      • 您是否会说媒体文件夹也应该在公共文件夹中,并且出于安全原因,我应该将所有公共文件包含在一个文件夹中?就像在 Apache/php 世界中一样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多