Django静态页面自动生成
背景
解决问题
有些页面的更新频率并不高,虽然也依赖于数据库的数据,但是该数据更新的周期长、用户的访问频率高,针对这样的页面没有必要每次访问的时候都要去查询数据库,这样只会增加数据库的负载,因此想到一个办法是直接生成静态的页面提供给用户进行访问,只有当后台管理员更新数据的时候,这个时候才重新生成静态文件。
使用模块
django-celery
使用
创建celery任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38from goods.models import GoodsType, IndexTypeGoodsType, IndexPromotionBanner, IndexGoodsBanner
from django.template import loader
from django.conf import settings
def static_index():
'''生成静态页面'''
# 获取所有的商品模型
goods_type = GoodsType.objects.all()
# 获取首页banner图
index_banner = IndexGoodsBanner.objects.all().order_by('index')
# 获取首页活动
index_activity = IndexPromotionBanner.objects.all().order_by('index')
# 获取首页的分类展示内容
for type in goods_type:
# 获取type种类首页分类商品的图片信息
subtitle =IndexTypeGoodsType.objects.filter(type=type, display=1).order_by('index')
# 获取type种类首页分类商品的文字展示信息
image =IndexTypeGoodsType.objects.filter(type=type, display=0).order_by('index')
type.image_banners = image
type.subtitle = subtitle
context = {
"types": goods_type,
"index_banner": index_banner,
"index_activity": index_activity,
}
# 通过模版生成静态文件
temp = loader.get_template('Good/static_index.html')
index_file = temp.render(context)
# 将静态文件写入对应的目录下
save_path = os.path.join(settings.BASE_DIR, 'static/index.html')
with open(save_path, 'wb') as f:
f.write(index_file)修改goods app对应的admin.py文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36from django.contrib import admin
from goods.models import GoodsType, IndexTypeGoodsType, IndexPromotionBanner, IndexGoodsBanner
from django.core.cache import cache
from celery_tasks import tasks
# Register your models here.
class BaseModelAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
'''新增或者save数据的时候,会自动调用这个方法'''
super().save_model(request, obj, form, change)
# 调用celery去生成静态页面
tasks.static_index.delay()
'''删除redis数据库中的缓存'''
cache.delete('index_page_data')
def delete_model(self, request, obj):
'''删除数据的时候,调用该方法'''
super().delete_model(request,obj)
tasks.static_index.delay()
'''删除redis数据库中的缓存'''
cache.delete('index_page_data')
class GoodsTypeAdmin(BaseModelAdmin):
pass
class IndexTypeGoodsTypeAdmin(BaseModelAdmin):
pass
class IndexPromotionBannerAdmin(BaseModelAdmin):
pass
class IndexGoodsBannerAdmin(BaseModelAdmin):
pass