BZ易风

导航

 

 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')

 

posted on 2019-10-02 23:26  BZ易风  阅读(268)  评论(0编辑  收藏  举报