zoukankan      html  css  js  c++  java
  • AI学习吧-购物车-添加商品接口

    create接口流程 

    需求:向购物车添加商品
    流程:写shopping_cart路由--->写ShoppingCart视图函数--->使用Authuser校验用户是否登录--->首先写添加create--->
    使用异常的格式,逻辑代码写在try里,报错涉及到用户认证错误,课程不存在错误、价格策略不存在错误、还有正常错误1004--->
    1.获取用户id--->获取课程id、价格策略id--->3.1校验课程是否存在---->
    3.2校验课程价格策略是否合法---->4.在redis中存储数据

      1、登录校验

      2、获取课程id和价格策略id,校验课程id和价格策略id是否合法

      3、通过用户id、课程id将课程信息放入购物车

    添加商品的数据结构

    遇到的问题,存储的解构设计问题,刚开始字典套字典,存取都麻烦,后来设计的合理的解构:
    
    #方案一
                '''
                user_id:{
                    shopping_car:{
                            course_id:{
                                name:"",
                                img:"",
                                price_plicy:{},
                                default_price_policy_id:3
                             }
                            }
                }
                
               '''
                #方案二
                #用户1买的课程2
                '''
               shopping_car_1_2:{
                                name:"",
                                img:"",
                                price_policy:{},
                                default_price_policy_id:3
                            
               }
               shopping_car_1_3:{
                                name:"",
                                img:"",
                                price_policy:{},
                                default_price_policy_id:3
                            
               }
        

    添加接口-create

    class ShoppingCart(ViewSetMixin, APIView):
        #对添加购物车之前对用户信息做校验
        authentication_classes = [UserAuth]
    
        def list(self, request, *args, **kwargs):
            pass
    
        def create(self, request, *args, **kwargs):  #添加到购物车
            """
             提交post请求,将提交课程存放redis中
    
            状态码:
                 1000 : 成功
                 1001 :认证失败
                 1002 : 课程不存在
                 1003 : 价格策略不存在
    
            """
    
            response=BaseResponse()
            try:
    
                # 1 用户的ID
                user_pk=request.user.pk
    
    
                # 2 获取课程ID和对应的价格策略ID
                course_id=request.data.get("course_id")
                price_policy_id=request.data.get("price_policy_id")
    
                # 3 校验数据合法性
    
                # 3.1 校验课程是否存在
                course_obj=Course.objects.get(pk=course_id)   #如果遇见课程id不存在,
                                         直接会执行ObjectDoesNotExist这个异常
    # 3.2 校验课程价格策略id是否合法 #查找课程的价格策略 price_policy_list=course_obj.price_policy.all() #判断这个课程价格策略是否在数据库中 price_policy_dict={} #构造个字典为了判断价格策略id是否在price_plicy_list里 for price_policy in price_policy_list: price_policy_dict[price_policy.pk]={ "prcie":price_policy.price, "valid_period":price_policy.valid_period, "valid_period_text":price_policy.get_valid_period_display(), } ''' price_policy_dict: # price_policy_dict的数据格式 { 1:{"price":100,"valid_period":60}, 2:{"price":200,"valid_period":120}, } ''' if price_policy_id not in price_policy_dict: raise PriceDoesNotExist # 4.向redis存储 #方案一 ''' user_id:{ shopping_car:{ course_id:{ name:"", img:"", price_plicy:{}, default_price_policy_id:3 } } } ''' #方案二 ''' shopping_car_1_2:{ name:"", img:"", price_policy:{}, default_price_policy_id:3 } shopping_car_1_3:{ name:"", img:"", price_policy:{}, default_price_policy_id:3 } shopping_car_2_1:{ name:"", img:"", price_policy:{}, default_price_policy_id:3 } ''' #redis接口1 # import redis # pool=redis.ConnectionPool(host="127.0.0.1",port="6379") # redis=redis.Redis(connection_pool=pool) #redis接口2 from django_redis import get_redis_connection redis=get_redis_connection("default") #使用redis中get_redis_connection函数,
                                      在setting中配置default
    from django.conf import settings import json shopping_car_key=settings.SHOPPING_CAR_KEY%(user_pk,course_id)
      
           #向SHOPPING_CAR_KEY="shopping_car_%s_%s" 字典传入参数 course_info={ "name":course_obj.name, "course_img":course_obj.course_img, "relate_price_policy":json.dumps(price_policy_dict), "default_price_policy_id":price_policy_id } #向redis中存储购物车商品数据 redis.hmset(shopping_car_key,course_info) response.data="添加购物车成功!" except ObjectDoesNotExist as e: response.code="1002", response.errot="课程不存在" except PriceDoesNotExist as e: response.code="1003", response.errot=e.error except Exception as e: response.code="1004", response.error=str(e) # 返回购物车商品数据 return Response(response.dict)

    遇见的问题:

    在使用redis存储数据时,构造数据结构时出现了问题,原因是使用字典套字典的格式,user_id, shopping_car, 
    course_idcourse_imgprice_policydefault_price_policy 这样存储数据时一层套一层,想取到里边的值时很麻烦,
    而且存储也不方便,于是使用了shopping_car_%s_%s这种格式,给传入user_id和course_id,
    里边就是course_name,course_img,price_policy,default_price_policy方便存储。

    create制作流程详细

    a.校验买课的用户是否登录;

     在AuthUser中获取到user.name,user.token进行校验

    b.获取课程id和价格策略id;

     从发来的请求中获取这俩值

    c.校验数据合法性

    d.向redis中存储

    首先配置redis,在setting中配置,顺便启动redis服务端和客户端

    # redis配置
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                # "PASSWORD": "密码",
            }
        }
    }

    redis的接口可以是以下俩种,一般第二个方便

    #redis接口1
    import redis
    pool=redis.ConnectionPool(host="127.0.0.1",port="6379")
    redis=redis.Redis(connection_pool=pool)
    
    redis接口2
    from django_redis import get_redis_connection
    redis=get_redis_connection("default")   #使用redis中get_redis_connection函数,在setting中配置default

    接着构造字典的键和值shopping_car_key和course_info,进行redis存储

    redis.hmset(shopping_car_key,course_info)
    测试效果

    使用postman发送

        {
            "course_id":1,
            "price_policy_id":2
        }

    响应

    {
        "code": 1000,
        "data": "添加购物车成功!",
        "error": ""
    }

    使用redis进行查询

    import redis
    
    # redis = redis.Redis(host='127.0.0.1', port=6379)
    
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
    
    redis = redis.Redis(connection_pool=pool)
    
    print(redis.hgetall("shopping_car_1_1"))

    效果:

    {b'name': b'pythonxe5x85xa8xe6xa0x88', b'default_price_policy_id': b'2', 
    b'course_img': b'python.png',
    b'relate_price_policy': b'{"1": {"prcie": 100.0, "valid_period": 7, "valid_period_text": "1\u5468"},
    "2": {"prcie": 200.0, "valid_period": 14, "valid_period_text": "2\u5468"},
    "3": {"prcie": 300.0, "valid_period": 180, "valid_period_text": "6\u4e2a\u6708"}}
    '}

    效果图-作出黑框里这些内容

  • 相关阅读:
    initializer_list形参
    前置递增运算符和后置递增运算符的区别
    基本的TCP socket API
    C++ find()函数
    python-对目录下的文件按时间排序
    js常用方法
    selenium中的对文本进行全选,复制,粘贴,剪切和删除的操作
    python 打包exe 命令及去除 cmd框
    mysql命令行修改密码
    html文件转换成excel
  • 原文地址:https://www.cnblogs.com/djfboai/p/10111709.html
Copyright © 2011-2022 走看看