为什么CSS和JS不应该通过Django?
根据这个回答,针对在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
一个网页服务器提供的内容大致可以分为两类。
- 静态内容
- 动态内容
静态文件(比如CSS、JS、图片等)通常是不会改变的(也就是说,它们可以直接从硬盘读取,然后发送给用户。(发送之前不需要任何处理)
动态文件(比如你的网站动态生成的HTML页面)通常需要经过各种处理(比如数据库的数据、表单的处理、消息等),然后再发送给用户。
如果某个内容是固定不变的,适合所有用户使用,就不要让网页框架来处理这些内容(这样会增加额外的负担),让网页服务器来处理就可以了。
11
Apache和Nginx比Django快,因为它们做的事情更少、更简单。所以用Django来提供CSS和JS文件其实是浪费资源。
不过,我觉得这里的“应该”用得有点重。更准确的说法是:“如果你的网站流量很大,那就应该这样做。”