为什么 Django 不在生产中提供静态文件?

Why isn't Django serving staticfiles in production?

我想知道 Django 在 DEGUB = False.

时为什么不在生产中提供统计文件的原因

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

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

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

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

问题

I am just wondering, why do we have to specify the staticfiles based on server in production, when Django could do everything for us as it have always done in localhost?

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

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

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

Isn't load the files from another storage so much slower than load them from main folder of the project?

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