美文网首页
django+nginx实现页面静态化

django+nginx实现页面静态化

作者: warmsirius | 来源:发表于2019-09-25 08:08 被阅读0次

    写在前面

    为什么要做首页页面静态化?

    • 电商网站流量大,首页的数据频繁请求数据库会速度慢

    • 首页的部分数据并未变化,所以更不必频繁请求数据库获取同样的数据

    实现原理

    • 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;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:django+nginx实现页面静态化

          本文链接:https://www.haomeiwen.com/subject/hszqsctx.html