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的各种数据格式进行保存数据,更加灵活多变.
当我仰望星空, 看见了涛涛江水, 闻到了人声鼎沸;可当我蓦然回望,再也触摸不到那逝去的时光,再也看不到那夕阳下的少年!
分类:
Django_NOTES
, DRF_NOTES
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗