对于商品详情页,因查询数据量大,而且是用户频繁访问的页面,为了减少数据库查询次数,提升页面响应效率,也要对详情页进行静态化处理。

对于首页广告的数据,因变化非常的频繁,可以使用定时任务进行静态化。对于详情页的数据,因变化的频率没有首页广告那么频繁,而且是当SKU信息有改变时才要更新的,所以可以采用新的静态化方案。具体实现呢,可以当后台运营人员修改了SKU信息时,异步的静态化处理对应的商品详情页面。

注意:

  • 用户数据和购物车数据不能静态化。
  • 热销排行和商品评价不能静态化。

下面通过Python脚本手动一次性批量生成所有商品静态详情页为例:

1. 定义批量静态化详情页脚本文件

1.准备脚本目录和Python脚本文件

2.指定Python脚本解析器

#!/usr/bin/env python

3.添加Python脚本导包路径

#!/usr/bin/env pythonimport sys
sys.path.insert(0, '../')

4.设置Python脚本Django环境

#!/usr/bin/env pythonimport sys
sys.path.insert(0, '../')import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'import django
django.setup()

5.编写静态化详情页Python脚本代码

#!/usr/bin/env pythonimport sys
sys.path.insert(0, '../')import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'import django
django.setup()from django.template import loader
from django.conf import settingsfrom goods import models
from contents.utils import get_categories
from goods.utils import get_breadcrumbdef generate_static_sku_detail_html(sku_id):"""生成静态商品详情页面:param sku_id: 商品sku id"""# 获取当前sku的信息sku = models.SKU.objects.get(id=sku_id)# 查询商品频道分类categories = get_categories()# 查询面包屑导航breadcrumb = get_breadcrumb(sku.category)# 构建当前商品的规格键sku_specs = sku.specs.order_by('spec_id')sku_key = []for spec in sku_specs:sku_key.append(spec.option.id)# 获取当前商品的所有SKUskus = sku.spu.sku_set.all()# 构建不同规格参数(选项)的sku字典spec_sku_map = {}for s in skus:# 获取sku的规格参数s_specs = s.specs.order_by('spec_id')# 用于形成规格参数-sku字典的键key = []for spec in s_specs:key.append(spec.option.id)# 向规格参数-sku字典添加记录spec_sku_map[tuple(key)] = s.id# 获取当前商品的规格信息goods_specs = sku.spu.specs.order_by('id')# 若当前sku的规格信息不完整,则不再继续if len(sku_key) < len(goods_specs):returnfor index, spec in enumerate(goods_specs):# 复制当前sku的规格键key = sku_key[:]# 该规格的选项spec_options = spec.options.all()for option in spec_options:# 在规格参数sku字典中查找符合当前规格的skukey[index] = option.idoption.sku_id = spec_sku_map.get(tuple(key))spec.spec_options = spec_options# 上下文context = {'categories': categories,'breadcrumb': breadcrumb,'sku': sku,'specs': goods_specs,}template = loader.get_template('detail.html')html_text = template.render(context)file_path = os.path.join(settings.STATICFILES_DIRS[0], 'detail/'+str(sku_id)+'.html')with open(file_path, 'w') as f:f.write(html_text)if __name__ == '__main__':skus = models.SKU.objects.all()for sku in skus:print(sku.id)generate_static_sku_detail_html(sku.id)

2. 执行批量静态化详情页脚本文件

1.添加Python脚本文件可执行权限

$ chmod +x regenerate_detail_html.py

【Windows下不用执行加权限的命令】

2.执行批量静态化详情页脚本文件

$ cd ~/projects/meiduo_project/meiduo_mall/scripts
$ ./regenerate_detail_html.py

提示:跟测试静态首页一样的,使用Python自带的http.server模块来模拟静态服务器,提供静态首页的访问测试。

# 进入到static上级目录
$ cd ~/projects/meiduo_project/meiduo_mall/meiduo_mall
# 开启测试静态服务器
$ python -m http.server 8080 --bind 127.0.0.1

项目性能优化(页面静态化2)相关推荐

  1. 网站优化---页面静态化技术

    一: 首先先区分一下动态页面和静态页面的区别 动态文件:PHP脚本.Java脚本等 动态文件的执行过程:词法.语法分析 -> 编译 -> 渲染输出 静态文件:HTML文件 从加载速度上可以 ...

  2. 项目性能优化(实现页面静态化1)

    当首页访问频繁,而且查询数据量大,其中还有大量的循环处理时,这会耗费服务器大量的资源,并且响应数据的效率,这时就需要页面静态化. 1. 页面静态化介绍 1.为什么要做页面静态化 减少数据库查询次数. ...

  3. 网站性能优化之_页面静态化

    现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面 ...

  4. 性能优化:用FreeMarker实现页面静态化

    [IT168 技术]众所周知,随着网站的访问量增加,如何给用户以良好的访问体验就显得尤为重要.提升网站性能便成为一些网站面临的一大难题,像hao123这样的导航网站要提升网站的性能只要部署的web服务 ...

  5. 大型网站架构提速关键技术(页面静态化、memcached、Mysql优化)

    大型网站关键技术介绍 1. pv值(page views),访问量大 带来问题 a. 流量大 10000000*2m ->解决方案 买带宽 ,优化程序(处理图片) b. 并发量,同时访问网站的人 ...

  6. 如何通过页面静态化提升论坛性能

    为什么80%的码农都做不了架构师?>>>    页面静态化可以提升网站性能,但是如何才能提升论坛性能...浏览还可以,但是数据提交静态化似乎很难提升性能. 转载于:https://m ...

  7. 赋值后页面不渲染_第七节:框架搭建之页面静态化的剖析

    一. 前言 抛砖引玉: 提到项目性能优化,大部分人第一时间就会想到缓存,针对"读多写少"的数据,可以放到缓存里,设置个过期时间,这样就不用每次都去数据库中查询了, 减轻了数据库的压 ...

  8. 该页面仅以HTML格式保存_第七节:框架搭建之页面静态化的剖析

    一. 前言 抛砖引玉: 提到项目性能优化,大部分人第一时间就会想到缓存,针对"读多写少"的数据,可以放到缓存里,设置个过期时间,这样就不用每次都去数据库中查询了, 减轻了数据库的压 ...

  9. 第七节:框架搭建之页面静态化的剖析

    一. 前言 抛砖引玉: 提到项目性能优化,大部分人第一时间就会想到缓存,针对"读多写少"的数据,可以放到缓存里,设置个过期时间,这样就不用每次都去数据库中查询了, 减轻了数据库的压 ...

最新文章

  1. 字节跳动客户开发_实习|字节跳动 客户端实习生 1-5面 面经
  2. MySQL—04—MySQL的其他对象
  3. 带参数标签的取值方法
  4. 动手拆解众筹明星产品安全智能锁KeyWe后,发现它不安全且无解
  5. 雪花算法生成数字id_全局唯一iD的生成 雪花算法详解及其他用法
  6. 【DirectX】D3D中基本图形绘制函数形参意义(总结)
  7. 解决9341系列LCD,使用杜邦线等连接线,造成白屏问题
  8. 量化基金投资常用策略简介
  9. 抖音小程序Tiktok开发教程之 基础组件 04 icon 图标组件
  10. 【ML】管理和跟踪机器学习实验
  11. Java 中获取Exception的详细信息
  12. java集合根据条件筛选数据
  13. Ubuntu16.04 安装 CUDA、CUDNN、OpenCV 并用 Anaconda 配置 Tensorflow 和 Caffe 详细过程(此种方案不好,好的方案是另一篇,基于pyhton2的)
  14. 有钱人抢豪宅,普通人不敢消费:社会在割裂,富人更富,穷人更穷
  15. UML图之类图,对象图和包图
  16. 石子游戏大合集[博弈论]
  17. k8s探针检测php,k8s实践11:kubernetes监测探针简单测试
  18. esp8266编译固件问题 踏坑之旅
  19. 【RSA-Tool 2 by tE】的使用
  20. kubernets 学习记录

热门文章

  1. 46W 奖金池等你来战!微众银行第三届金融科技高校技术大赛火热报名中!
  2. 腾讯天衍实验室夺世界机器人大赛双冠军,新算法突破脑机接口瓶颈
  3. 11位科幻作家参与,首次AI人机共创写作实验启动
  4. 从词袋到Transfomer,NLP十年突破史
  5. 算力“竞速”,企业AI落地的当务之急
  6. 会数据分析的人别再低调了,我怕你会因此错失100万奖金
  7. 实战:掌握PyTorch图片分类的简明教程 | 附完整代码
  8. Decoders对于语义分割的重要性 | CVPR 2019
  9. 免费公开课 | 数据科学家,从入门到精进!【今晚福利】
  10. 为什么阿里巴巴要禁用 Executors 创建线程池?