4

我想知道为什么 Django 在生产中不提供 statifiles 的原因,当DEGUB = False.

STATICFILES_DIRS
我们指定STATICFILES_DIRS告诉 Django 在哪里寻找绑定到指定应用程序的静态文件。

STATIC_ROOT
我们指定STATIC_ROOT告诉 Django 运行后将python manage.py collectstatic文件存储在哪里,因此每个静态文件都存储在STATIC_ROOT.
假设我们设置STATIC_ROOT = "staticfiles/".
这意味着一旦我们运行 collectstatic 命令,所有STATICFILES_DIRS路径内的文件都将存储在“staticfiles/”中

STATIC_URL 最后我们指定STATIC_URL为“prefix”来告诉Djando去哪里寻找静态文件,例如在HTML<link>标签中,我们看到的url是基于STATIC_URL值的

当我们将项目上传到服务器时,我们会上传整个项目,因此每个文件。为什么 Django 在服务器上运行时不能自己提供静态文件?
正如我刚才所说,我们上传了整个文件夹,所以我们上传的文件就在那里(还有静态文件!)。

问题

  • 我只是想知道,为什么我们必须在生产中基于服务器指定静态文件,而 Django 可以像在 localhost 中一样为我们做所有事情?
  • 从另一个存储加载文件不是比从项目的主文件夹加载文件慢得多吗?
4

1 回答 1

3

我只是想知道,为什么我们必须在生产中基于服务器指定静态文件,而 Django 可以像在 localhost 中一样为我们做所有事情?

因为它可能效率低下且不安全。每次发出请求时,请求都会通过所有中间件,然后视图将产生一个响应,该响应将再次通过中间件传递给客户端。如果您第二次请求同一个文件,它可能没有任何缓存,因此再次重复该过程。如果您使用像 Nginx/Apache 这样的网络服务器,它可能会缓存结果。如果您使用 CDN,那么它还将联系最近的服务器,从而以更有效的方式访问这些资源。

另一个问题是安全性。如果您指定了不应提供的文件的路径,则网络服务器应阻止浏览器访问该文件。例如,一些黑客试图访问浏览器的源文件,然后寻找漏洞。这应该是不可能的。像 Apache 或 Nginx 这样的 Web 服务器可能会为此配备更高级的安全机制。

如果你真的想要,你可以使用WhiteNoise让 Django 在生产中提供静态文件和媒体文件。此 Django 应用程序已针对安全性和效率进行了优化。虽然很难判断它是否与 Apache 或 Nginx 服务器具有相同的级别。

从另一个存储加载文件不是比从项目的主文件夹加载文件慢得多吗?

网络服务器不会联系其他存储:浏览器会这样做。因此,它可能会联系 CDN,而不是网络服务器。这可能效率稍低,因为网络浏览器通常会重用与服务器的开放连接来发出更多请求,但通常您已经联系过该 CDN,例如 JavaScript 文件。此外,CDN 被优化以尽可能高效地交付内容:浏览器通常会联系靠近客户端的浏览器,并且通常还会有负载平衡和冗余,以降低服务器不再提供资源的可能性。

于 2022-02-01T17:04:52.510 回答