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://:passwordpassword@47.193.146.xxx: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')
    # 删除缓存
    # cache.delete("键名")
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()方法进行保存数据, 个人理解:缓存这里和redis肯定建立的是长连接,使用get_redis_connection()可能建立的是短链接。但是直接使用cache,只可以使用cache,get()进行获取数据, 使用cache.set()进行设置缓存. 但是,使用get_redis_connection(),可以自由使用redis的各种数据格式进行保存数据,更加灵活多变.

 

posted @   lowmanisbusy  阅读(1825)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示