Django实战----页面静态化

关于页面静态化

前言:

因为代码在windows上运行,Linux上的定时任务无法使用,正常来说要把页面静态化的脚本做成定时任务,每过一段时间自动渲染一次,因为MySQL内的数据是会变化的

为什么要做页面静态化
  1. 减少数据库查询次数。
  2. 提升页面响应效率。
具体的做法
  1. 将动态渲染生成的页面结果保存成html文件,放到静态文件服务器中。
  2. 用户直接去静态服务器,访问处理好的静态html文件。
哪些数据不能静态化处理
  1. 用户相关数据不能静态化:
    1.1 用户名、购物车等不能静态化。
  2. 动态变化的数据不能静态化:
    2.1热销排行、新品推荐、分页排序数据等等。
  3. 不能静态化的数据处理:
    3.1 可以在用户得到页面后,在页面中向后端发送Ajax请求获取相关数据。
    3.2 直接使用模板渲染出来。
    3.3 其他合理的处理方式等等。

渲染index.html静态化(代码)

  1. 查询相关的数据 组织成前端模板需要的数据
  2. 加载需要渲染的模板
    2.1 获取模板对象 loader模块的get_template(‘模板名字’)方法
    from django.template import loader
    index_template = loader.get_template('index.html')
  3. 数据渲染到模板上面
    3.1 render方法(数据)
    index_html_data = index_template.render(context)
  4. 把渲染完成后的模板放入到静态服务器中

代码
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)

渲染商品详情页面(代码)

  1. 加载Django环境
# 加载django环境
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings')
import django

django.setup()
  1. 查询出相关数据 组织成前端需要的数据格式
  2. 加载需要渲染的模板
  3. 渲染模板
  4. 保存渲染后的模板到指定位置

代码
#!/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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值