• django-配置静态页面-celery/redis/nginx


     celery生成静态页面

    celery_tasks/tasks.py

    # 生成静态首页
    from django.template import loader, RequestContext  # templates包
    from goods.models import GoodsType,IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner
    from django_redis import get_redis_connection
    @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_banners
            type.title_banners = title_banners
     
    
        # 组织模板上下文
        context = {'types': types,
                   'goods_banners': goods_banners,
                   'promotion_banners': promotion_banners}
    
        # 使用模板
        # 1.加载模板文件,返回模板对象
        temp = loader.get_template('static_index.html')  # 需要导入templates包
        # 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)

    模板文件

    static_index.html

    {% extends 'layout/static_base.html' %}
    {% load staticfiles %}
    {% block title %}天天生鲜-首页{% endblock title %}
    {% block topfiles %}
        <script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/jquery-ui.min.js' %}"></script>
        <script type="text/javascript" src="{% static 'js/slide.js' %}"></script>
    {% endblock topfiles %}
    {% block body %}
        <div class="navbar_con">
            <div class="navbar">
                <h1 class="fl">全部商品分类</h1>
                <ul class="navlist fl">
                    <li><a href="">首页</a></li>
                    <li class="interval">|</li>
                    <li><a href="">手机生鲜</a></li>
                    <li class="interval">|</li>
                    <li><a href="">抽奖</a></li>
                </ul>
            </div>
        </div>
    
        <div class="center_con clearfix">
            {# 导航菜单 #}
            <ul class="subnav fl">
                {% for type in types %}
                    <li><a href="#model0{{ forloop.counter }}" class="{{ type.logo }}">{{ type.name }}</a></li>
                {% endfor %}
            </ul>
            {# 轮播图 #}
            <div class="slide fl">
                <ul class="slide_pics">
                    {% for banner in goods_banners  %}
                        <li><a href="{% url 'goods:detail' banner.sku.id %}"><img src="{{ banner.image.url }}" alt="幻灯片"></a></li>
                    {% endfor %}
                </ul>
                <div class="prev"></div>
                <div class="next"></div>
                <ul class="points"></ul>
            </div>
            {# 商品活动 #}
            <div class="adv fl">
                {% for banner in promotion_banners %}
                    <a href="{{ banner.url }}"><img src="{{ banner.image.url }}"></a>
                {% endfor %}
            </div>
        </div>
    
        {% for type in types %}
        {# 首页分类商品展示信息 #}
        <div class="list_model">
            <div class="list_title clearfix">
                <h3 class="fl" id="model0{{ forloop.counter }}">{{ type.name }}</h3>
                {# 分类商品的文字展示信息 #}
                <div class="subtitle fl">
                    <span>|</span>
                    {% for banner in type.title_banners %}
                        <a href="{% url 'goods:detail' banner.sku.id  %}">{{ banner.sku.name }}</a>
                    {% endfor %}
                </div>
                <a href="#" class="goods_more fr" id="fruit_more">查看更多 ></a>
            </div>
    
            <div class="goods_con clearfix">
                <div class="goods_banner fl"><img src="{{ type.image.url }}"></div>
                {# 分类商品的图片展示信息 #}
                <ul class="goods_list fl">
                    {% for banner in type.image_banners %}
                    <li>
                        <h4><a href="{% url 'goods:detail' banner.sku.id  %}">{{ banner.sku.name }}</a></h4>
                        <a href="{% url 'goods:detail' banner.sku.id  %}"><img src="{{ banner.sku.image.url }}"></a>
                        <div class="prize">¥ {{ banner.sku.price }}</div>
                    </li>
                    {% endfor %}
                </ul>
            </div>
        </div>
        {% endfor %}
    {% endblock body %}

    启动celery

    celery -A celery_tasks.tasks worker -l info

    生成静态页面

    >>> from celery_tasks.tasks import generate_static_index_html
    >>> res = generate_static_index_html.delay()
    >>> res
    <AsyncResult: 917ef40d-2c98-43d8-ac4f-0cb6d81d1358>

    配置nginx.conf

    sudo vi /usr/local/nginx/conf/nginx.conf中在http中添加

     server {
             listen       80;
             server_name  localhost;
     
             #charset koi8-r;
     
             #access_log  logs/host.access.log  main;
     
             location /static {
                 # 指定静态文件存放的目录
                 alias /home/python/bj18/ttsx/dailyfresh/static/;
             }
             location / {
                # 指定首页静态文件存放的目录
                 root  /home/python/bj18/ttsx/dailyfresh/static/;
                 index  index.html index.htm;
             }

    重启nginx

    sudo sbin/nginx -s reload

    浏览器中 直接输入绑定的ip地址就可进入静态主页

     数据更新或删除时自动生成静态页面

    文档:https://yiyibooks.cn/xx/django_182/ref/contrib/admin/index.html

    goods/admin.py管理更新首页表数据重新生成静态首页

    from django.contrib import admin
    from goods.models import *
    
    # Register your models here.
    
    class BaseModelAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            '''新增或修改的时候调用'''
            # 调用父类的save_model()方法
            super().save_model(request, obj, form, change)
            # 调用celery重新生成
            from celery_tasks.tasks import generate_static_index_html  # 不能放在上面 不然会报错
            generate_static_index_html.delay()
            # 清除首页缓存数据
    
    
        def delete_model(self, request, obj):
            '''删除数据时候调用'''
            # 调用父类delete_model()方法
            super().delete_model(request, obj)
            # 重新生成静态页面
            from celery_tasks.tasks import generate_static_index_html  # 不能放在上面 不然会报错
            generate_static_index_html.delay()
            # 清除首页缓存数据
    
    class IndexPromotionAdmin(BaseModelAdmin):
        pass
    
    class IndexTypeGoodsBannerAdmin(BaseModelAdmin):
        pass
    
    class GoodsTypeAdmin(BaseModelAdmin):
        pass
    
    class IndexGoodsBannerAdmin(BaseModelAdmin):
        pass
    
    admin.site.register(IndexPromotionBanner, IndexPromotionAdmin)
    admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
    admin.site.register(GoodsType, GoodsTypeAdmin)
    admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)

    使用缓存

    文档:https://yiyibooks.cn/xx/django_182/topics/cache.html

    底层缓存API

     视图函数views.py中导入cache包

    from django.core.cache import cache  # 底层缓存API
    class IndexView(View):
        '''首页'''
        def get(self, request):
            '''显示首页'''
            # 获取缓存数据
            context = cache.get('index_page_data')
    
            if context is None:
                print('设置缓存')
                # 获取商品的种类信息
                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_banners
                    type.title_banners = title_banners
    
                # 组织模板上下文
                context = {'types': types,
                           'goods_banners': goods_banners,
                           'promotion_banners': promotion_banners}
                # 设置缓存
                # key  value timeout
                cache.set('index_page_data', context, 3600)
    
            return render(request, 'index.html', context)

    清除缓存

    站点管理goods/admin.py

    from django.core.cache import cache
    class BaseModelAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            '''新增或修改的时候调用'''
            # 调用父类的save_model()方法
            super().save_model(request, obj, form, change)
            # 调用celery重新生成
            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):
            '''删除数据时候调用'''
            # 调用父类delete_model()方法
            super().delete_model(request, obj)
            # 重新生成静态页面
            from celery_tasks.tasks import generate_static_index_html  # 不能放在上面 不然会报错
            generate_static_index_html.delay()
            # 清除首页缓存数据
            cache.delete('index_page_data')
  • 相关阅读:
    Sublime Text3 python自动补全Anaconda插件
    Delphi多线程详解
    3-4.文件类型
    3-3.记录类型
    3-2.结构类型之数组类型
    3-1.结构类型之集合类型
    delphi基础篇之数据类型之三:3.结构类型(Struct)
    delphi基础篇之数据类型之二:2.字符串类型
    delphi基础篇之数据类型之一:1.简单类型(Simple)
    delphi基础篇之数据类型概论
  • 原文地址:https://www.cnblogs.com/yifengs/p/11618814.html
Copyright © 2020-2023  润新知