专栏首页Python 学习day99-redis入门&增删改查购物车&购物车数据结构
原创

day99-redis入门&增删改查购物车&购物车数据结构

1.启动redis

进入到redis解压目录
命令行运行redis-server.exe redis.windows.conf

2.python链接redis,根据具体需要的配置进入 ConnectionPool 里面查看并配置

# redis 连接池
POOL = redis.ConnectionPool(host='127.0.0.1',
                            port=6379,
                            decode_responses=True)

REDIS_CONN = redis.Redis(connection_pool=POOL)

3.redis的基础用法

3.1 .set() 和 .get()

3.2 .hset() 和 .hget()

3.3 .hmset() 和 .hgetall()

3.4 .scan_iter()

3.5 .exists()

3.6 .delete()

3.7 .keys()

4.字典的嵌套,注意 json 的序列化★★★★★

5.新增、删除、修改、查看购物车

class ShoppingCarView(APIView):
    authentication_classes = [authentication.MyAuthentication, ]

    @staticmethod
    def post(request):
        my_res = BaseResponse()
        # {"course_id": 1, "price_policy_id": 1}
        try:
            """1.判断课程是否合法"""
            course_id = request.data.get('course_id', '')
            course_obj = models.Course.objects.filter(id=course_id).first()
            if not course_obj:
                raise MyException(101, '课程非法或不存在!')

            """2.判断价格策略是否合法"""
            price_policy_id = request.data.get('price_policy_id', '')
            all_price_policy_query_set = course_obj.price_policy.all()
            if not all_price_policy_query_set.filter(id=price_policy_id).first():
                raise MyException(102, '价格策略不合法')

            """3.拿到课程信息"""
            course_info = {
                'title': course_obj.title,
                'course_img': str(course_obj.course_img),
                'category': course_obj.category.title,
                'course_type': course_obj.get_course_type_display(),
                'brief': course_obj.brief,
                'level': course_obj.get_level_display(),
            }

            """4.拿到所有的价格策略"""
            price_policy_dict = {}
            for price_policy_obj in all_price_policy_query_set.order_by('price'):
                price_policy_dict[price_policy_obj.id] = {
                    'valid_period': price_policy_obj.get_valid_period_display(),
                    'price': price_policy_obj.price
                }

            """5.组建购物车"""
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            course_info['price_policy_dict'] = price_policy_dict
            course_info['default_price_policy_id'] = price_policy_id

            """6.将组建好的购物车写进 Redis"""
            course_info = json.dumps(course_info)
            REDIS_CONN.set(shopping_car_key, course_info)
            my_res.code = 100
            my_res.msg = '加入购物车成功!'

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -100
            my_res.msg = str(e)

        return Response(my_res.dict)

    @staticmethod
    def get(request):
        my_res = BaseResponse()
        try:
            user_id = request.user.pk
            shopping_car_key = SHOPPING_CAR.format(user_id, '*')
            """找到所有的keys"""
            all_shopping_car_keys = REDIS_CONN.scan_iter(shopping_car_key)
            if not all_shopping_car_keys:
                raise MyException(201, '购物车不存在')
            shopping_car = {}
            for key in all_shopping_car_keys:
                shopping_car[key] = json.loads(
                    REDIS_CONN.get(key)
                )
            my_res.code = 200
            my_res.msg = 'SUCCESS'
            my_res.data = shopping_car

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg

        except Exception as e:
            my_res.code = -200
            my_res.msg = str(e)

        return Response(my_res.dict)

    @staticmethod
    def put(request):
        my_res = BaseResponse()
        # {"course_id": 1, "price_policy_id": 1}
        try:
            """1.检查课程id是否存在于redis中"""
            course_id = request.data.get('course_id', '')
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            if not REDIS_CONN.exists(shopping_car_key):
                raise MyException(301, '购物车不存在此课程')

            """2.判断价格策略是否合法"""
            price_policy_id = request.data.get('price_policy_id', '')
            price_policy_query_set = models.Course.objects.filter(id=course_id).first().price_policy.all()
            if not price_policy_query_set.filter(id=price_policy_id):
                raise MyException(402, '价格策略不合法')

            """3.从Redis里面找到该用户的购物车,修改后重新写进 Redis"""
            shopping_car = json.loads(REDIS_CONN.get(shopping_car_key))
            shopping_car['default_price_policy_id'] = price_policy_id
            REDIS_CONN.set(shopping_car_key, json.dumps(shopping_car, ensure_ascii=True))
            my_res.code = 400
            my_res.msg = 'SUCCESS'
            my_res.data = shopping_car

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -400
            my_res.msg = str(e)
        return Response(my_res.dict)

    @staticmethod
    def delete(request):
        # 版本优化批量删除
        my_res = BaseResponse()
        try:
            """获取课程id,判断是否在Redis中"""
            course_id = request.data.get('course_id', '')
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            if not REDIS_CONN.exists(shopping_car_key):
                raise MyException(501, '购物车不存在此课程')
            REDIS_CONN.delete(shopping_car_key)
            my_res.code = 500
            my_res.msg = '删除成功!'
        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -500
            my_res.code = str(e)
        return Response(my_res.dict)

6.购物车数据结构

shopping_car = {
        # 购物车数据结构
        "shopping_car_ {}_ {}": {
            "id": "XXX",
            "title": "XXX",
            "course_img": "XXX",
            "price_policy_dict": {
                "valid_period": "XXX",
                "price": "XXX"
            },
            "default_price_policy_id": "XXX"
        },
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • day101-支付接口&支付数据结构

    少年包青菜
  • day86-ES6一般的语法和Vue的认识

    少年包青菜
  • day83-<权限组件>-批量操作权限以及权限的分配

    少年包青菜
  • JPA 原生CRUD 语句

    @Modifying @Query(value = "delete from t_sys_org_user where org_id=?1 and user_...

    一个会写诗的程序员
  • FreeBSD下的工具(sysctl、netstat等)如何移植到F-Stack

    在之前的文章中,我们介绍了如何使用DPDK rte_ring来进行多进程的通信,tools/ipc目录就是基于rte_ring实现了一个简单的ipc框架。下面以...

    F-Stack
  • MySQL replace用法简介

    今天在工作的过程中碰到一个问题,要把数据库中某个列的所有值中含有"ceshi.test.com"的字符去掉,本来可以写个脚本,把所有的值都取出再导入进行处理,但...

    MySQL轻松学
  • 一次 RabbitMQ 生产故障引发的服务重连限流思考

    原由是生产环境 RabbitMQ 消息中间件因为某些原因出现了故障导致当时一些相关的服务短时间不可用,后来 RabbitMQ 修复之后,按理来说服务是要正常恢复...

    五月君
  • Spring5参考指南: SpEL

    SpEL的全称叫做Spring Expression Language。通常是为了在XML或者注解里面方便求值用的,通过编写#{ <expression str...

    程序那些事
  • LeetCode :2.两数相加 解题报告及算法优化思路

    还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解释链表就是:上线和下线。

    若羽
  • CentOS 安装nodejs 8

    飞奔去旅行

扫码关注云+社区

领取腾讯云代金券