关于页面静态化
前言:
因为代码在windows上运行,Linux上的定时任务无法使用,正常来说要把页面静态化的脚本做成定时任务,每过一段时间自动渲染一次,因为MySQL内的数据是会变化的
为什么要做页面静态化
- 减少数据库查询次数。
- 提升页面响应效率。
具体的做法
- 将动态渲染生成的页面结果保存成html文件,放到静态文件服务器中。
- 用户直接去静态服务器,访问处理好的静态html文件。
哪些数据不能静态化处理
- 用户相关数据不能静态化:
1.1 用户名、购物车等不能静态化。 - 动态变化的数据不能静态化:
2.1热销排行、新品推荐、分页排序数据等等。 - 不能静态化的数据处理:
3.1 可以在用户得到页面后,在页面中向后端发送Ajax请求获取相关数据。
3.2 直接使用模板渲染出来。
3.3 其他合理的处理方式等等。
渲染index.html静态化(代码)
- 查询相关的数据 组织成前端模板需要的数据
- 加载需要渲染的模板
2.1 获取模板对象 loader模块的get_template(‘模板名字’)方法
from django.template import loader
index_template = loader.get_template('index.html')
- 数据渲染到模板上面
3.1 render方法(数据)
index_html_data = index_template.render(context)
- 把渲染完成后的模板放入到静态服务器中
代码
import os
from apps.contents.models import ContentCategory
from meiduo_market import settings
from utils.goods import get_categories
def generate_static_index_html():
# 1查询相关数据
# 获取频道和分类数据
categories = get_categories()
# 广告数据
contents = {}
# 所有广告分类
content_categories = ContentCategory.objects.all()
# 遍历 获取分类下所有广告 添加到字典
for cat in content_categories:
contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')
# 渲染模板的上下文
context = {
'categories': categories,
'contents': contents,
}
# 2加载需要渲染模板
from django.template import loader
# 获取模板对象
index_template = loader.get_template('index.html')
# 3把数据渲染到模板上
index_html_data = index_template.render(context)
# 4把渲染好的模板保存成html文件,写入到指定文件
# settings.BASE_DIR /home/halon/Desktop/meiduo_pro/meiduo
# os.path.dirname(settings.BASE_DIR) /home/halon/Desktop/meiduo_pro
# / home / halon / Desktop / meiduo_pro/front_end_pc/index.html
file_path = os.path.join(os.path.dirname(settings.BASE_DIR), 'front_end_pc/index.html')
print(file_path)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(index_html_data)
渲染商品详情页面(代码)
- 加载Django环境
# 加载django环境
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings')
import django
django.setup()
- 查询出相关数据 组织成前端需要的数据格式
- 加载需要渲染的模板
- 渲染模板
- 保存渲染后的模板到指定位置
代码
#!/usr/bin/env python
import sys
sys.path.insert(0, '../')
# 加载django环境
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings')
import django
django.setup()
from apps.goods.models import SKU
from utils.goods import get_goods_specs, get_categories, get_breadcrumb
from django.conf import settings
from apps.goods import models
def generate_static_sku_detail_html(sku_id):
# - 1查询相关数据
"""提供商品详情页"""
# 获取当前sku的信息
sku = SKU.objects.get(id=sku_id)
# 查询商品频道分类
categories = get_categories()
# 查询面包屑导航
breadcrumb = get_breadcrumb(sku.category)
# 获取规格
specs = get_goods_specs(sku)
# 渲染页面
context = {
'categories': categories,
'breadcrumb': breadcrumb,
'sku': sku,
'specs': specs,
}
# - 2加载需要渲染模板
from django.template import loader
# 获取模板对象
index_template = loader.get_template('detail.html')
# 3把数据渲染到模板上
index_html_data = index_template.render(context)
# 4把渲染好的模板保存成html文件写入到指定文件
file_path = os.path.join(os.path.dirname(settings.BASE_DIR), 'front_end_pc/goods/' + str(sku_id) + '.html')
with open(file_path, 'w') as f:
f.write(index_html_data)
if __name__ == '__main__':
skus = models.SKU.objects.all()
for sku in skus:
print(sku.id)
generate_static_sku_detail_html(sku.id)