系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。
12.4.1 HTTP性能优化中间件
在django中可以通过内置的中间件以及缓存来优化HTTP性能。django提供了两个中间件对HTTP性能进行优化,分别是ConditionalGetMiddleware以及GZipMiddleware。通过ConditionalGetMiddleware中间件,可以支持现代浏览器的条件请求,通过GZipMiddleware中间件,可以对服务端响应的内容进行压缩。
12.4.2 ConditionalGetMiddleware
django通过ConditionalGetMiddleware中间件,来支持现代浏览器的条件请求。服务端在进行响应时,如果没有在响应报头中加入ETag字段,ConditionalGetMiddleware会在必要时加上该字段(该字段包含了响应资源的哈希值),以辅助服务器对web客户端的缓存验证进行控制。
web客户端下次向服务器请求资源时,会在If-None-Match字段中携带ETag的值,以询问资源是否发生变化。
服务器收到请求时会再次计算资源的哈希值,然后与请求中的ETag进行比较,如未发生变化,则向浏览器响应一个304的状态码,指示内容未发生修改。通过ETag来对资源进行缓存控制,可以节省服务器的带宽,服务器不需要每次都把资源返回给客户端,从而提升了HTTP的性能。在settings.py中配置中间件ConditionalGetMiddleware:
MIDDLEWARE = [ # 在django中配置ConditionalGetMiddleware中间件 'django.middleware.http.ConditionalGetMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
12.4.3 GZipMiddleware
使用GzipMiddleware中间件可以对响应的内容,使用Gzip算法来进行压缩。在django中配置GzipMiddleware,需要将其放置在对响应的内容进行读写的中间件前面:
MIDDLEWARE = [ # 在django中配置GZipMiddleware中间件 ' django.middleware.gzip.GZipMiddleware', # 在django中配置ConditionalGetMiddleware中间件 'django.middleware.http.ConditionalGetMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
如出现以下一种情况,则GZipMiddleware不会对响应的数据进行压缩:
(1) 响应的内容长度少于200个字节
(2) 响应的报头中已经携带了Content-Encoding字段
(3) 在web客户端请求报头中的Accept-Encoding字段中,没有包含gzip
12.4.4 基于缓存的会话
在django中对会话信息进行缓存,需要先在项目中进行缓存相关的配置。在配置文件中可以通过全局变量SESSION_CACHE_ALIAS来指定一个缓存实例,如未进行指定,django会使用默认的缓存实例。配置完毕以后,需要再通过SESSION_ENGINE变量来指定数据存储的方式:
(1) 设置SESSION_ENGINE为django.contrib.sessions.backends.cache
django会对会话信息进行简单的存储,不会进行数据存储的持久化操作。
(2) 设置SESSION_ENGINE为django.contrib.sessions.backends.cached_db
django会对缓存的会话信息进行持久化操作,将数据写回到数据库中。
12.4.5 对静态文件进行安全缓存
在项目中开启ManifestStaticFilesStorage以后,django会在所有静态文件的文件名中加入一个MD5的哈希值(该哈希值根据文件内容进行生成)。例如静态文件styles.css会被保存为styles.55e7cbb9ba48.css。
在文件名中加上该哈希值有助于浏览器对静态文件进行长时间安全地缓存,而不会错过文件内容的变化。一旦文件内容发生变化,浏览器会自动加载该静态文件。
在django中开启ManifestStaticFilesStorage,需要进行以下几步操作:
(1) 在settings.py中将STATICFILES_STORAGE设置为:
'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
(2) 将DEBUG设置为False
(3) 执行python manage.py collectstatic命令来收集所有静态文件
在django中使用第三方的minify工具,可以对HTML, CSS, 以及JavaScript静态文件进行压缩处理。这些工具会删除文件中的空白字符,注释等非必需的内容,从而减小文件的体积,节省服务器的带宽。
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。