- 商品列表页中商品分类数据依然采用页面静态化技术展示。
- 商品列表页中商品分类数据的静态化由运营人员在编辑商品分类信息时触发生成静态化页面。
- 商品列表页中商品分类数据的页面静态化处理,我们选择使用异步任务类执行。
1.准备静态化异步任务
<1>在celery_tasks中新建的HTML / tasks.py任务
import os
from time import sleep
from django.conf import settings
from django.template import loader
from celery_tasks.main import app
from goods.utils import get_categories
@app.task(name='generate_static_list_search_html')
def generate_static_list_search_html():
"""
生成静态的商品列表页和搜索结果页html文件
"""
# 商品分类菜单
categories = get_categories()
# 渲染模板,生成静态html文件
context = {
'categories': categories,
}
sleep(4)
template = loader.get_template('list.html')
html_text = template.render(context)
file_path = os.path.join(os.path.dirname(os.path.dirname(settings.BASE_DIR)), 'front_end_pc/list.html')
with open(file_path, 'w') as f:
f.write(html_text)
<2>注册异步任务(celery_tasks/main)
app.autodiscover_tasks(['celery_tasks.sms', 'celery_tasks.emil', 'celery_tasks.static_html'])
<3>在goods.utils.py文件中封装方法,获取商品分类菜单数据
from collections import OrderedDict
from .models import GoodsChannel
def get_categories():
"""
获取商城商品分类菜单
:return 菜单字典
"""
# 商品频道及分类菜单
# 使用有序字典保存类别的顺序
# categories = {
# 1: { # 组1
# 'channels': [{'id':, 'name':, 'url':},{}, {}...],
# 'sub_cats': [{'id':, 'name':, 'sub_cats':[{},{}]}, {}, {}, ..]
# },
# 2: { # 组2
#
# }
# }
categories = OrderedDict()
channels = GoodsChannel.objects.order_by('group_id', 'sequence')
for channel in channels:
group_id = channel.group_id # 当前组
if group_id not in categories:
categories[group_id] = {'channels': [], 'sub_cats': []}
cat1 = channel.category # 当前频道的类别
# 追加当前频道
categories[group_id]['channels'].append({
'id': cat1.id,
'name': cat1.name,
'url': channel.url
})
# 构建当前类别的子类别
for cat2 in cat1.goodscategory_set.all():
cat2.sub_cats = []
for cat3 in cat2.goodscategory_set.all():
cat2.sub_cats.append(cat3)
categories[group_id]['sub_cats'].append(cat2)
return categories
2.运营人员站点中触发异步任务
from django.contrib import admin
from celery_tasks.static_html.tasks import generate_static_list_search_html
from . import models
class GoodsAdmin(admin.ModelAdmin):
# 商品spu表的后台管理器
list_display = ['id', 'name']
def save_model(self, request, obj, form, change):
obj.save()
generate_static_list_search_html.delay()
def delete_model(self, request, obj):
generate_static_list_search_html.delay()
admin.site.register(models.GoodsCategory)
admin.site.register(models.GoodsChannel)
admin.site.register(models.Goods, GoodsAdmin)
admin.site.register(models.Brand)
admin.site.register(models.GoodsSpecification)
admin.site.register(models.SpecificationOption)
admin.site.register(models.SKU)
admin.site.register(models.SKUSpecification)
admin.site.register(models.SKUImage)