Django 静态与用户上传文件

Django static vs. user uploaded files

阅读了大量文档后,我仍然不太清楚究竟什么是静态文件与用户上传文件……或者什么是静态文件。

1.静态文件

Django describes 静态文件,如 "images, javascript, css"。好的,有道理。但是所有那些 .py 文件和 .html 模板文件等......它们不是静态的?当网站 运行 时,他们不会 "change"。什么是静态文件? "serving static files" 是什么意思?这与 "serving" "views.py" 文件或 "home.html" 文件有何不同?

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

另外,"collectstatic" 去哪里找所有假定的静态文件呢?它会检查我的所有代码并查看我在何处访问图像/javascript 文件吗?

2。用户上传文件

假设我只是从表面上看这个静态的东西,如果用户上传图片会怎样?我是否需要在后台持续运行 "collectstatic" 的程序 运行?

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

这个"MEDIA_ROOT"目录下的文件不是"collectstatic"收集的吗?如果我将所有图像 / javascript / css 放入此媒体文件夹会怎样?然后什么都没有收集?这有什么问题吗?

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

1

静态文件是您的 HTML 模板正确显示所需的一切 - CSS、JavaScript、图像、Flash 文件等。它们被区别对待,因为没有任何内容Django 与他们有关的特殊之处。 (对于你的 views.py,它必须 运行 其中的 Python 代码,对于模板,它需要呈现你使用过的任何模板标签等 - 对于静态资产,他们只需要将 "as is" 提供给用户)

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

2

collectstatic 命令不会收集用户上传的文件 - 可以单独保存。您不想将自己的 CSS/JS/images 等与它们混淆。

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

What exactly is a static file?

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

What does "serving static files" mean?

服务静态文件是发送文件以响应网络请求,这是由网络服务器完成的。

why do I even need "collectstatic" anyway?

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

Do I need a program running in the background that constantly runs "collectstatic"?

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

这些文件应该与服务器上的项目文件分开,甚至在其他服务器上,以便在您更新站点时它们会保留在原处。

大多数答案已经在文档中给出:

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

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

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

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

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

当您使用专业版时,静态文件应存储在项目目录外的文件夹 staticfiles/static 中。 staticfiles/media 中的媒体(您可以为这些目录指定其他名称)。这样做有两个原因:在安全方面,以及您的所有静态文件都由单独的网络服务器提供服务。您可能希望在每次更改时自动 运行 收集静态信息 - 尝试使用 fabric。用户上传您的媒体文件夹中已有的所有文件 - 因此您不需要 运行 collectstatic。