页面静态化
首页被访问的比较频繁,为了提升访问速度,可以使用页面静态化技术。
页面静态化即将动态渲染生成的界面保存成 html 文件,放到静态服务器中,用户访问的时候访问的直接是处理好之后的 html 静态文件。
对于页面中属于每个用户展示不同数据内容的部分,可以在用户请求完静态化之后的页面后,在页面中向后端发送请求,获取属于用户的特殊的数据
首页静态化
简单来说就是从数据库中查询对应数据,然后使用模板进行渲染,然后将渲染好的模板 html 文件保存到静态服务器中
首页静态化逻辑
- 先查询商品频道及分类菜单,使用 OrderedDict() 创建一个有序字典
- 从 GoodsChannel 商品频道表中查询出所有的组,并以组号和组内顺序进行排序
- 从上一步查询处理的商品频道对象遍历,然后取出每个组对象
- 取出当前组,根据商量的好的数据传输形式创建好对应的字典,
categories[group_id] = {'channels': [], 'sub_cats': []}
- 通过外键取得当前频道的类别
- 追加当前频道
- 查询当前类别的子类别,这是自关联查询,将最后查询出来的类别加入到字典中
- 循环得到所有频道及分类数据
- 查询广告内容
- 查询出所有的广告内容类别
- 查询出每个广告内容类别对应的广告内容
- 将查询出来的 频道类别 和 广告内容 数据通过模板 template 渲染
- 将渲染后的数据保存到静态服务器的 index 文件中
模板语法与 Vue 模板语法冲突
都是使用双大括号 {{ }} moustache 语法,为了解决冲突
可以通过在前端中修改Vue的模板变量语法来避免冲突
var vm = new Vue({ el: '#app', delimiters: ['[[', ']]'], ... })
通过delimiters声明,将Vue的模板变量变为了
[[
、]]
定时任务
对于首页的静态化,考虑到页面的数据可能有多名运营人员维护,并且经常变动,所以将其做成定时任务,即定时执行静态化。
在 Django 中执行定时任务,可以通过 django-crontab 扩展来实现
安装、添加应用
设置任务的定时时间
在配置文件中设置定时执行的时间
每个定时任务分为三部分定义:
-
任务时间
基本格式 : * * * * * 分 时 日 月 周 命令 M: 分钟(0-59)。每分钟用*或者 */1表示 H:小时(0-23)。(0表示0点) D:天(1-31)。 m: 月(1-12)。 d: 一星期内的天(0~6,0为星期天)。
-
任务方法
-
任务日志
首页的定时任务设置如下
# 定时任务
CRONJOBS = [
# 每5分钟执行一次生成主页静态文件
('*/5 * * * *', 'contents.crons.generate_static_index_html', '>> /home/python/Desktop/meiduo_mall/logs/crontab.log')
]
命令
# 添加定时任务到系统中
python manage.py crontab add # 添加一次即可,系统级别的任务
# 显示已经激活的定时任务
python manage.py crontab show
# 移除定时任务
python manage.py crontab remove
静态化首页的手动脚本
新建一个可执行的文件
主要就是执行一下上面写好的生成静态的首页的函数,不过为了让文件可以运行起来,需要配合 Django 的运行环境
商品详情页
商品详情页依然采用页面静态化技术
区别就是商品详情是在运营人员进行编辑商品信息时会触发生成静态化页面
使用异步任务来实现详情页静态化
详情页静态化逻辑
- 使用 celery 异步来完成任务
- 使用之前封装的商品分类菜单函数来获得商品分类
- 获取当前 sku 的信息
- 获取面包屑导航信息中的频道
- 构建当前商品的规格键
- 获取当前商品的所有 SKU
- 构建不同规格参数(选项)的 sku 字典
- 获取当前商品的规格信息
- 渲染模板生成静态文件
异步任务的触发
商品详情页的数据是在数据进行修改的时候异步触发进行生成,
运营人员一般是在 Admin 站点中进行商品信息的修改,需要调整 Admin 站点保存和删除商品信息时的行为。
在 Admin 站点保存或删除数据时,Django 是调用的 Admin 站点管理器类的 save_model() 方法和 delete_model() 方法,我们只需要重新实现这两个方法即可,每次保存和修改都从新进行生成