写在前面
为什么要做首页页面静态化?
-
电商网站流量大,首页的数据频繁请求数据库会速度慢
-
首页的部分数据并未变化,所以更不必频繁请求数据库获取同样的数据
实现原理
-
1、使用django-celery异步生成页面
-
2、增加Django的模型admin管理类,在数据库进行增加、修改或者删除操作的时候,调用1,重新生成页面
-
3、将生成的首页页面部署到nginx上去,通过nginx提供静态页面
问题1:什么时候首页的静态页面需要重新生成?
- 当管理员后台修改首页信息对应的表格中的数据的时候,需要重新生成首页静态页面。
实现过程
django-celery异步生成静态页面
# celery_tasks--tasks.py
from django.template import loader, RequestContext
# 初始化Django环境
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')#做的初始化
django.setup()
from goods.models import GoodsType, IndexGoodsBanner, IndexTypeGoodsBanner, IndexPromotionBanner
# 注意:模型的导入一定要在初始化环境之后
# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://ali2.teeh.cn:6379/8')
@app.task
def generate_static_index_html():
'''产生首页静态页面'''
# 获取商品的种类信息
types = GoodsType.objects.all()
# 获取首页轮播商品信息
goods_banner = IndexGoodsBanner.objects.all().order_by('index')
# 获取首页促销活动信息
promotion_banners = IndexPromotionBanner.objects.all().order_by('index')
# 获取首页分类商品展示信息
for type in types:
# 获取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_banners
type.title_banners = title_banners
# 组织模板上下文
context = {
'types': types,
'goods_banners': goods_banner,
'promotion_banners': promotion_banners
}
# 使用模板
# 1. 加载模板文件
temp = loader.get_template('static_base.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)
django admin模型管理类
- save_model(self, request, obj, form, change)
数据新增或者更新表中的数据时会调用这个方法
- delete_model(self, request, obj)
删除表中的数据时调用这个方法
# goods--admin.py
from django.contrib import admin
from .models import GoodsType, IndexPromotionBanner, IndexTypeGoodsBanner, IndexGoodsBanner
from django.core.cache import cache
# 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_html
generate_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_html
generate_static_index_html.delay()
class GoodsTypeAdmin(BaseModelAdmin):
pass
class IndexPromotionBannerAdmin(BaseModelAdmin):
pass
class IndexTypeGoodsBannereAdmin(BaseModelAdmin):
pass
class IndexGoodsBannerAdmin(BaseModelAdmin):
pass
admin.site.register(GoodsType, GoodsTypeAdmin)
admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)
admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannereAdmin)
服务器nginx配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /static {
alias /home/warmsirius/dailyfresh/static/;
}
location / {
#root html;
root /home/warmsirius/dailyfresh/static/;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
网友评论