0前言
1.使用Celery生成静态页面
task.py中新增任务函数generate_static_index_html(),任务函数生成静态页面。
@app.task
def generate_static_index_html():'''产生首页静态页面'''# 获取商品的种类信息types = GoodsType.objects.all()# 获取首页轮播商品信息goods_banners = IndexGoodsBanner.objects.all().order_by('index')# 获取首页促销活动信息promotion_banners = IndexPromotionBanner.objects.all().order_by('index')# 获取首页分类商品展示信息for type in types: # GoodsType# 获取type种类首页分类商品的图片展示信息image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')# 获取type种类首页分类商品的文字展示信息title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')# 动态给type增加属性,分别保存首页分类商品的图片展示信息和文字展示信息type.image_banners = image_bannerstype.title_banners = title_banners# 组织模板上下文context = {'types': types,'goods_banners': goods_banners,'promotion_banners': promotion_banners}# 使用模板# 1.加载模板文件,返回模板对象temp = loader.get_template('static_index.html')# 2.模板渲染static_index_html = temp.render(context)# 生成首页对应静态文件save_path = os.path.join(settings.BASE_DIR, 'static/index.html')with open(save_path, 'w') as f:f.write(static_index_html)
2.配置Nginx提供静态页面
Nginx配置文件中新增配置项
3.管理员修改首页所需要表中的数据时,重新生成index静态页面。
在goods应用下的admin文件中,重写save_model和delete_model方法。
当管理员在后台新增或者删除首先所需数据时,自动调用save_model或者delete_model,其中调用了Celery中的任务函数generate_static_index_html(),此时任务函数生成静态页面static/index.html,当用户访问时,将静态页面推送给浏览器。
from django.contrib import admin
from django.core.cache import cache
from goods.models import GoodsType,IndexPromotionBanner,IndexGoodsBanner,IndexTypeGoodsBanner
# Register your models here.class BaseModelAdmin(admin.ModelAdmin):def save_model(self, request, obj, form, change):'''新增或更新表中的数据时调用'''super().save_model(request, obj, form, change)# 发出任务,让celery worker重新生成首页静态页from celery_tasks.tasks import generate_static_index_htmlgenerate_static_index_html.delay()# 清除首页的缓存数据cache.delete('index_page_data')def delete_model(self, request, obj):'''删除表中的数据时调用'''super().delete_model(request, obj)# 发出任务,让celery worker重新生成首页静态页from celery_tasks.tasks import generate_static_index_htmlgenerate_static_index_html.delay()# 清除首页的缓存数据cache.delete('index_page_data')class GoodsTypeAdmin(BaseModelAdmin):passclass IndexGoodsBannerAdmin(BaseModelAdmin):passclass IndexTypeGoodsBannerAdmin(BaseModelAdmin):passclass IndexPromotionBannerAdmin(BaseModelAdmin):passadmin.site.register(GoodsType, GoodsTypeAdmin)
admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)
admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)