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