完整电商项目--(五)用户基本信息(3):地址的三级联动--缓存处理

认识缓存

在这里插入图片描述

django的缓存框架

  • 这个文档很详细的介绍了关于缓存的东西。

  • (1)我们之前讲过的设置缓存
    在这里插入图片描述
    我们使用的是设置 redis缓存后端。使用django-redis扩展包工具。这些缓存各有优点

  • (2)缓存有很多种
    在这里插入图片描述
    这些可以帮助我们完成 基于站点,视图, 模板片段等的缓存。调用方法讲的都很清晰。

  • 在阅读过这些之后,我们选择使用 底层的缓存API,因为我们所要缓存的只是一些简单的数据。
    下面来看下底层接口的用法:
    在这里插入图片描述

  • 增删改查的功能十分详细,并且支持缓存所有的Python数据类型(如果你不能说出增删改查的功能函数,请再仔细阅读一遍!)

下面我们就可以进行缓存设计(这个缓存的设计思路还是我们开头的第一张图中的伪代码的思路!

# Create your views here.
class AreaView(View):
    def get(self, request):
        area_id = request.GET.get('area_id')
        if area_id is None:
            # 先获取缓存,如果缓存中不存在,再查询 mysql并缓存
            # 拿缓存
            result = cache.get('province_list')
            if result is None:
                # 没有传递地区编号, 表示查询所有的省列表
                province_list = Area.objects.filter(parent__isnull=True)  # 表示父级为空: (sql)where parent is null, 作为外键,是parent ,但是 mysql中默认存储的字段名字是 parent_id 这里我们还是使用 parent
                # 进行处理,只返回地区对象的编号和名称
                province_list2 = []
                for province in province_list:
                    province_list2.append({
                        'id': province.id,
                        'name': province.name
                    })
                result = {
                    'code': RETCODE.OK,
                    'errmsg': "ok",
                    'province_list':province_list2
                }
                cache.set('province_list',result, constants.AREA_CACHE_EXPIRES)

            return http.JsonResponse(result)
        else:
            result = cache.get('area_'+area_id)
            if result is None:
                # 有地区编号,表示查询指定地区的子级地区列表
                try :
                    area = Area.objects.get(pk=area_id)
                except:
                    return http.JsonResponse({'code':RETCODE.PARAMERR, 'errmsg':"地区编号无效"})
                # 获取指定地区的子级地区
                sub_list=area.subs.all()
                # 整理前端需要的数据格式
                sub_list2 = []
                for sub in sub_list:
                    sub_list2.append({
                        'id':sub.id,
                        'name':sub.name
                    })
                result={
                    'code':RETCODE.OK,
                    'errmsg':"ok",
                    'sub_data':{
                        'id':area.id,
                        'name':area.name,
                        'subs':sub_list2
                    }
                }
                cache.set('area_' + str(area.id), result, constants.AREA_CACHE_EXPIRES)

            return http.JsonResponse(result)

代码很长,实际上非常简单~ 就是if else 语句, 然后通过 area_id 参数判断是 查询省,还是 市,区的信息。 接着判断缓存。添加缓存,再判断缓存,很易懂的逻辑。

over!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值