为什么CSS和JS不应该通过Django?

6 投票
3 回答
664 浏览
提问于 2025-04-16 18:22

根据这个回答,针对在Django中可以对JavaScript和CSS文件进行gzip压缩吗?这个问题:

在你的生产环境中,CSS和JS文件不应该通过Django来处理。你需要配置Apache(或者Nginx,或者其他服务器)来直接提供这些文件,这样你就可以在服务器上设置gzip压缩,而不是在Django中进行。

这个问题的回答没有解释为什么要这样做。是因为将静态内容(比如图片、CSS、JS)从不同的服务器提供会更快,所以这是个好习惯吗?还是说还有其他原因呢?

3 个回答

2

在生产环境中,你已经有了一个真实的HTTP服务器,它通过mod_python、fcgi或wsgi与Django连接,所以直接从这个服务器提供文件是很有道理的。

这样可以更快地发送响应:

  • 当你通过配置好的Apache或Nginx提供静态文件时,服务器的负担会很小。服务器会检查请求的路径下是否有文件,如果有,就把它发送给浏览器(当然还会加上一些头信息)。
  • 而如果你通过Django提供静态文件,首先是Web服务器要连接到Django,然后Django要处理的事情就复杂多了:
    • 创建请求对象,
    • 运行URL模式的正则匹配,直到找到负责处理静态文件的部分,
    • 运行一些代码来发送文件给用户……

这样会消耗更少的资源:

  • 每个Django进程消耗的内存非常多,想象一下,和同样配置的Apache进程相比,Django进程可能要多消耗10倍的内存来处理同样的静态文件。

它的扩展性更好:

  • 配置好的Nginx可以处理比Django多100倍的请求,同时消耗的CPU和内存要少得多……

可以外包处理:

  • 虽然说需要配置Apache或Nginx,但你也可以不这样做——你可以把这些文件外包给像Amazon S3或Google API这样的服务,这样JavaScript和CSS文件就会离用户“更近”,而且像Google API这样的服务,有可能你想添加的库(比如jQuery)已经在用户的浏览器中缓存了。

把这些因素加在一起,简单来说就是会让你的网站加载得更快

3

一个网页服务器提供的内容大致可以分为两类。

  1. 静态内容
  2. 动态内容

静态文件(比如CSS、JS、图片等)通常是不会改变的(也就是说,它们可以直接从硬盘读取,然后发送给用户。(发送之前不需要任何处理)

动态文件(比如你的网站动态生成的HTML页面)通常需要经过各种处理(比如数据库的数据、表单的处理、消息等),然后再发送给用户。

如果某个内容是固定不变的,适合所有用户使用,就不要让网页框架来处理这些内容(这样会增加额外的负担),让网页服务器来处理就可以了。

11

Apache和Nginx比Django快,因为它们做的事情更少、更简单。所以用Django来提供CSS和JS文件其实是浪费资源。

不过,我觉得这里的“应该”用得有点重。更准确的说法是:“如果你的网站流量很大,那就应该这样做。”

撰写回答