django中有两种不同类型的“静态”文件。
- 捆绑资源/资产与应用(CSS,JavaScript的典型值)
- 任何文件上传您的用户。
由于这些是两个不同类别的静态文件,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中隔离。
你会说媒体文件夹应该在公共场所吗?为了安全起见,我应该在一个文件夹中包含所有公共文件?就像它在Apache/PHP世界中一样? – Matthieu