Django 静态与用户上传的文件

Posted

技术标签:

【中文标题】Django 静态与用户上传的文件【英文标题】:Django static vs. user uploaded files 【发布时间】:2015-12-24 15:34:50 【问题描述】:

在阅读了大量文档之后,我仍然没有很好地了解究竟什么是静态文件与用户上传的文件......或者静态文件究竟是什么。

1.静态文件

Django describes 静态文件,例如“图像、javascript、css”。好的,有道理。但是所有那些 .py 文件和 .html 模板文件等......它们不是静态的?当网站运行时,它们不会“改变”。究竟什么是静态文件? “提供静态文件”是什么意思?这与“提供”“views.py”文件或“home.html”文件有什么不同?

除此之外,为什么我还需要“collectstatic”?为什么我所有的静态文件都需要放在一个地方?我想如果您使用单独的网络服务器来“服务”它们,那是有道理的......仍然,不确定这到底意味着什么。

另外,无论如何,“collectstatic”去哪里找到所有假定的静态文件?它是否会遍历我的所有代码并查看我在哪里访问图像/javascript 文件?

2。用户上传的文件

假设我只是从表面上看这个静态的东西,如果用户上传图片会发生什么?我是否需要在后台运行的程序不断运行“collectstatic”?

Django describes 媒体文件作为管理用户上传内容的一种方式。老实说,我还没有尝试过(现在会这样做),但这仍然代表了一个问题:如果将所有“静态”文件放在一个地方如此重要,为什么突然可以不为用户这样做 -上传的文件?

这个“MEDIA_ROOT”目录中的文件不是由“collectstatic”收集的吗?如果我只是把我所有的图片/javascript/css 放到这个媒体文件夹中呢?然后什么都没有收集?这有什么问题吗?

感谢任何人对此提出的任何见解。

【问题讨论】:

【参考方案1】:

大部分答案已经在文档中给出:

    https://docs.djangoproject.com/en/1.8/ref/contrib/staticfiles/ - django 如何查找静态文件等

    https://docs.djangoproject.com/en/1.8/howto/static-files/ - 如何在 dev 中提供静态文件

    https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ - 如何在 pro 中提供静态文件 + 一些关于通过 fabric 自动收集静态文件的介绍。

简而言之:静态文件是负责网站外观的文件,而不是负责网站结构和信息表示(css、js、img、视频等)的文件。

在 dev 中,您将所有静态文件放在 static 中,它会自动由开发服务器提供服务。

当您使用专业版时,静态文件应存储在项目目录之外的文件夹 staticfiles/static 中。 staticfiles/media 中的媒体(您可以为这些目录指定其他名称)。应该这样做有两个原因:就安全性而言,并且所有静态都由单独的 Web 服务器提供服务。您可能希望在每次更改时自动运行 collectstatic - 尝试使用 fabric。用户上传您的媒体文件夹中已有的所有文件 - 因此您无需为它运行 collectstatic。

【讨论】:

【参考方案2】:

究竟什么是静态文件?

静态文件是您在项目中创建的文件,需要直接提供给浏览器(通常是 JavaScript、CSS 和图像)。 您的 Python 文件(如 views.py)不会直接发送到浏览器,它们会进行一些处理以创建将发送到浏览器的 HTML 文件。

“提供静态文件”是什么意思?

提供静态文件是为了响应网络请求而发送文件,这是由网络服务器完成的。

为什么我还需要“collectstatic”?

collectstatic 使用 settings.py 中的 STATICFILES_DIRS 变量来查找所有静态文件并将它们放在一个位置。您必须在生产服务器中执行此操作,因为该文件夹应该具有与项目文件不同的安全设置。例如,您不希望用户能够下载您的 model.py。 collectstatic 还可以使用 django-pipeline 之类的东西进行缩小和混淆。

我是否需要在后台运行一个不断运行“collectstatic”的程序?

不,媒体文件是另一回事。这些是用户上传到您的系统的文件(与您创建的静态文件相反)。这些文件通常保存到服务器上的文件系统中,并在数据库中创建一条记录,其中包含文件的地址和模型中定义的一些元数据。 models.FileField 有一个 upload_to 属性,用于控制这些文件相对于 settings.py 中的 MEDIA_ROOT 变量的存储位置。

这些文件应与服务器上的项目文件或什至其他服务器上的项目文件分开,以便在您更新站点时它们仍然存在。

【讨论】:

【参考方案3】:

1

静态文件是 HTML 模板正确显示所需的一切 - CSS、JavaScript、图像、Flash 文件等。它们的处理方式不同,因为 Django 与它们没有什么特殊关系。 (使用您的views.py,它必须在其中运行Python代码,使用模板,它需要呈现您使用过的任何模板标签等 - 使用静态资产,它们只需要“按原样”提供给用户)

collectstatic 命令将查看您的每个应用的“静态”子目录,以及您在 STATICFILES_DIRS 设置中定义的任何其他目录。这意味着您的 Web 服务器(Apache、nginx 等)只需要提供一个目录即可使您的所有资产都可供用户使用,而不是每个应用程序的“静态”目录。

2

collectstatic 命令不会收集用户上传的文件 - 并且可以单独保存。您不想将自己的 CSS/JS/图像等与它们混为一谈。

它们已经放在一个可由您的网络服务器提供服务的目录中,根本不需要定期收集。

【讨论】:

以上是关于Django 静态与用户上传的文件的主要内容,如果未能解决你的问题,请参考以下文章

Django配置用户上传文件夹和暴露后端文件夹资源

Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决

我需要通过 django 管理面板上传模板,其中包含索引文件和静态文件

django静态文件处理

第三百八十七节,Django+Xadmin打造上线标准的在线教育平台—网站上传资源的配置与显示

[Python] Django框架入门5——静态文件中间件上传图片和分页