Django静态页面自动生成

背景

  • 解决问题

    有些页面的更新频率并不高,虽然也依赖于数据库的数据,但是该数据更新的周期长、用户的访问频率高,针对这样的页面没有必要每次访问的时候都要去查询数据库,这样只会增加数据库的负载,因此想到一个办法是直接生成静态的页面提供给用户进行访问,只有当后台管理员更新数据的时候,这个时候才重新生成静态文件。

  • 使用模块

    django-celery

使用

  1. 创建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
    38
    from goods.models import GoodsType, IndexTypeGoodsType, IndexPromotionBanner, IndexGoodsBanner
    from django.template import loader
    from django.conf import settings

    @app.task
    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)
  2. 修改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
    36
    from 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