Django 项目中设置缓存

Posted lowmanisbusy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 项目中设置缓存相关的知识,希望对你有一定的参考价值。

一.配置文件settings.py中

# 设置django缓存存放位置为redis数据库,并设置一个默认(default)选项,在redis中(配置文件/etc/redis/redis.conf)开启了RDB持久化储存
# pip install django-redis, 然后在视图中可以通过 from django_redis import get_redis_connection 这个方法和redis数据库进行连接
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # redis服务器的ip地址及端口号,及数据库序号,redis一共有15个数据库 0~15
        "LOCATION": "redis://127.0.0.1:6379/6",
     # "LOCATION": "redis://:[email protected]:6379/0", # 如果redis设置密码的话,需要以这种格式进行设置,host前面是密码
"OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }

二.某个应用的视图文件views.py中

from django.shortcuts import render, redirect
from django.views.generic import View
from goods.models import GoodsType, IndexGoodsBanner, IndexPromotionBanner, IndexTypeGoodsBanner, GoodsSKU
from order.models import OrderGoods
from django_redis import get_redis_connection

# 使用该模块的方法, 可以设置和取出缓存(缓存一些无须用户登录就可以获取的数据)
# 保存缓存的载体已经在settings中设置成redis
from django.core.cache import cache

from django.core.urlresolvers import reverse
from django.core.paginator import Paginator

# http://127.0.0.1:8000/index
class IndexView(View):
    """首页"""
    def get(self, request):
        """显示网页"""
          # 每次来自浏览器首页的请求,都先尝试获取缓存
          context = cache.get(index_page_data)
      if context is None:
            # 获取商品分类信息, 有那几大类商品
            types = GoodsType.objects.all()

            # 获取首页轮播商品的信息
            index_banner = IndexGoodsBanner.objects.all().order_by(index)

            # 获取首页促销活动的信息
            promotion_banner = IndexPromotionBanner.objects.all().order_by(index)

            # 获取首页分类商品活动的信息
            # types_goods_banner = IndexTypeGoodsBanner.objects.all()
            for type in types:
                # 根据type查询type种类首页展示的文字商品信息和图片商品信息
                title_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by(index)
                image_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by(index)
                # 给type对象增加两个属性title_banner, image_banner
                # 分别保存type种类首页展示的文字商品信息和图片商品信息
                type.title_banner = title_banner
                type.image_banner = image_banner

            # 将购物车显示数量设置为零
            cart_count = 0

            # 组织缓存的上下文
            context = {
                types: types,
                index_banner: index_banner,
                promotion_banner: promotion_banner,
                cart_count: cart_count
            }
            # 设置缓存, 第一个参数是键名,第二个值,第三个是过期时间, 不设置过期时间,就是永不过期
            cache.set(index_page_data, context, 3600)# 获取登录用户后购物车商品的数目,先设置为零
        cart_count = 0
        # 获取user
        user = request.user
        if user.is_authenticated():
            # 用户已登录
             conn = get_redis_connection(default)
          cart_key = cart_%d%user.id
          cart_count = conn.hlen(cart_key)
        # 更新模板上下文
        context.update(cart_count=cart_count)
        # 使用模板
        return render(request, index.html, context)

        

这里既使用cache模块将数据保存到redis中(已经在配置文件中将缓存数据库设置为了redis), 也使用了django_redis模块的get_redis_connection()方法进行保存数据, 个人理解,这里应该没有什么区别, 但是直接使用cache,只可以使用cache,get()进行获取数据, 使用cache.set()进行设置缓存. 但是,使用get_redis_connection(),可以自由使用redis的各种数据格式进行保存数据,更加灵活多变.

 


以上是关于Django 项目中设置缓存的主要内容,如果未能解决你的问题,请参考以下文章

在片段中设置文本颜色

如何在 PyCharm 中设置 Django 项目

在 Django 项目中设置 Jinja2

在 windows 的 django 中设置一个 cron 作业

如何在android的片段中设置应用程序上下文?

django项目数据库中 表结构设计 和 同一表中设置多个联合唯一 存在的问题分析