在Django应用部署上线之后,随着用户量和数据量的增多,网站可能会越来越慢,这时候对应用的性能进行优化就是一个首要的问题。在这里,州的先生分享8个简单(不需要复杂的操作和设置)、免费(不需要花钱升级服务器配置或购买加速包)、快速(能够很快看到效果)的方法,帮助大家优化自己的Django应用。
这8个方法的结构如下图所示:
下面我们来详细介绍。
一、压缩图片
对于图片较多的站点而言,图片的大小和数量直接影响着站点的访问速度。如果网站页面上的图片是必须存在的,那么就需要考虑对其进行优化。而对图片进行压缩,则是最直接的方法。
我们可以在图片上传之前,使用工具对图片进行压缩,比如著名的图片压缩在线网站——TinyPNG.org。
然而完全指望用户或运营人员每次上传图片都主动对图片进行压缩是不现实的。除了在后台设置限制上传图片的大小以外,我们还可以利用Python在后台对上传的图片进行压缩处理、裁剪处理或是制作出不同尺寸的缩略图来。这些功能,通过Pillow模块即可实现。
二、压缩CSS、JS静态文件
对于一个Web网站而言,CSS为网站提供精美可观的界面、JS为网站实现各种动态的交互,都是必不可少的。但是如果不注意后期的CSS、JS文件优化,则会导致前端加载的CSS、JS文件占了整个响应过程的大部分,严重影响网站的访问体验。
而对CSS、JS文件进行压缩则是优化CSS、JS文件最快速的方法。我们以经典的前端UI框架——Bootstrap提供的源码来看看效果。
同样功能的JS文件,其中未压缩的文件为69kb,而压缩之后的文件大小为37kb,文件大小几乎减小了一半,如下图所示:
最简单的压缩原理,是通过删除 js 代码中所有注释、跳格符号、换行符号及无用的空格,从而压缩 JS 文件大小。我们同样以Bootstrap的JS源码为例来看看,如下图所示:
网上有很多网站都提供了在线进行CSS、JS文件压缩服务,比如http://tool.oschina.net/jscompress、https://tool.lu/js/ 等等
三、使用模板缓存
Django自带的模板引擎被很多人吐槽过性能差劲,但是将其更换为Jinja模板引擎其实也并非是一个好的选择。借助于Django模板提供的缓存选项,我们也能提高模板渲染的性能。
在模板中使用以下语句块即可使用模板缓存:
{% load cache %}
{% cache %}
……
{% endcache %}
四、创建数据表索引
前面3点都是关于前端的优化,下面我们来看看数据库的优化。
当数据库里面的数据越来越多,简单的查询语句可能都会花上不短的时间。而对数据字段进行索引的创建,则可以直接显著地提高查询的速度。
如果我们使用的是Django的ORM模型,那么在模型类定义中直接指定字段的db_index属性为True即可,如下代码所示:
class Stock(models.Model):
stock_date = models.DateField(verbose_name='日期',db_index=True)
然后生成数据迁移并执行,就完成了索引的创建。
五、减少数据查询次数
Django的ORM使用起来非常的简便,简便的背后则是其隐藏了大量的复杂性。特别是在涉及到多表之间的关系查询时,特别容易产生大量的数据库查询。借助于Django ORM提供的一些高级功能,我们能够从某种程度上改善这种情况,将调用的查询数据减少。
例如,我们可以借助select_related()查询集方法将涉及外键的查询合并为一个查询。下面是官方的示例:
在正常情况下,我们可能需要使用两条数据库查询:
# 先去数据库查Entry表
e = Entry.objects.get(id=5)
# 再去数据库查询相关的Blog对象
b = e.blog
而使用select_related()方法之后,我们就只需要一条数据库查询语句:
# 查询一次数据库.
e = Entry.objects.select_related('blog').get(id=5)
# 不再去数据库进行查询,e里面已经填充了Blog对象的数据
b = e.blog
类似的查询集方法还有一个prefetch_related(),它执行的是反向的查找。有兴趣可以阅读官方文档的内容。
六、减少返回的查询数量
很多小伙伴经常会使用all()查询集,调用一时爽,耗时火葬场。最好的方式是使用索引对限制返回的结果集,或者使用分页进行调用。
七、减少返回的数据字段
通常情况下,我们创建查询集都会直接发挥查询结果的所有字段,但如果一个表里面有几十甚至上百个字段,而我们只需要其中几个,返回的其他字段无疑会减缓数据传输的速度。Django的ORM中提供了一些查询集方法来让我们避免这个问题。其中:
- defer()方法:用于返回某字段以外的所有查询对象内容;
- only()方法:用于仅返回某字段的查询对象内容;
- values()方法:用于返回指定字段的所有查询对象字典;
- values_list()方法:用于返回指定字段的所有查询对象元祖;
大家可以根据实际的需要,灵活地使用这些查询集方法。
八、开启GZIP压缩
一般情况下,Django的应用都是部署在Linux+Nginx之上的。我们除了可以在前端文件、模板和后端数据库上进行简单但富有成效的优化外,还可以在Nginx上开启GZIP压缩功能,在服务器端对一些文本文件进行压缩后传输,可以显著减少这些文本文件的体积,进而加快响应速度,提高性能。
通常来说,在Nginx上开启GZIP压缩,只需要打开Nginx的配置文件——nginx.conf,取消如下内容的注释,并对部分值按需进行修改即可:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
最后,推荐两个用于网站测速的网站:
- Google PageSpeed:https://developers.google.cn/speed/pagespeed/insights/
- 卡卡网站测速:http://pagespeed.webkaka.com/
九、最后
以上就是本次所介绍的8点加速Django应用的简单方法。对Web应用的优化不止所介绍的这几点,而且是一个长期动态的过程,需要大家不断深入。有好的优化建议,欢迎留言讨论。
文章版权所有:州的先生博客,转载必须保留出处及原文链接