为什么 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 不能自己提供静态文件?
正如我刚才所说,我们上传了整个文件夹,所以我们上传的文件都在那里(还有静态文件!)。
问题
- 我只是想知道,为什么我们必须在生产中指定基于服务器的静态文件,而 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 被优化以尽可能高效地交付内容:浏览器通常会联系靠近客户端的浏览器,并且通常还会有负载平衡和冗余,以降低服务器不再为资源提供服务的可能性。
我想知道 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 不能自己提供静态文件?
正如我刚才所说,我们上传了整个文件夹,所以我们上传的文件都在那里(还有静态文件!)。
问题
- 我只是想知道,为什么我们必须在生产中指定基于服务器的静态文件,而 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 被优化以尽可能高效地交付内容:浏览器通常会联系靠近客户端的浏览器,并且通常还会有负载平衡和冗余,以降低服务器不再为资源提供服务的可能性。