Beispiel #1
0
    def put(self, request):
        data = json.loads(request.body.decode())
        sku_id = data.get('sku_id')
        count = data.get('count')
        cart_str = ''
        selected = data.get('selected', True)
        if not all([count, sku_id]):
            return http.JsonResponse({'code': 1, 'errormsg': 'error'})

        if selected:
            if not isinstance(selected, bool):
                return http.HttpResponseForbidden('参数selected有误')
        user = request.user
        sku = SKU.objects.get(id=sku_id)
        if user.is_authenticated:
            redis_conn = get_redis_connection('carts')
            redis_conn.hset('carts_{}'.format(user.id), sku_id, count)
            if selected:
                redis_conn.sadd('selected_{}'.format(user.id), sku_id)
            else:
                redis_conn.srem('selected_{}'.format(user.id), sku_id)

        else:
            # carts_srt = request.COOKIES.get('carts')
            # 用户未登录,修改cookie购物车
            cart_str = request.COOKIES.get('carts')

            # 将cart_str转成bytes,再将bytes转成base64的bytes,最后将bytes转字典

            cart_dict = pickle.loads(base64.b64decode(
                cart_str.encode())) if cart_str else {}
            cart_dict[sku_id] = {'count': count, 'selected': selected}

            cart_dict = pickle.dumps(cart_dict)
            cart_str_by = base64.b64encode(cart_dict)
            cart_str = cart_str_by.decode()

        cart_sku = {
            'id': sku_id,
            'count': count,
            'selected': selected,
            'name': sku.name,
            'default_image_url': sku.default_image.url,
            'price': sku.price,
            'amount': sku.price * count,
        }

        response = http.JsonResponse({
            'code': 0,
            'errmsg': '修改购物车成功',
            'cart_sku': cart_sku
        })
        if cart_str:
            response.set_cookie('carts', cart_str, max_age=24 * 30 * 3600)
        return response
Beispiel #2
0
    def put(self, request):
        # 接收参数
        cart_dict = ''
        json_dict = json.loads(request.body.decode())
        selected = json_dict.get('selected', True)

        # 校验参数
        if selected:
            if not isinstance(selected, bool):
                return http.HttpResponseForbidden('参数selected有误')

        user = request.user
        if user.is_authenticated:
            redis_conn = get_redis_connection('carts')
            cart = redis_conn.hgetall('carts_{}'.format(user.id))
            sku_id_list = cart.keys()
            redis_conn.sadd('selected_{}'.format(user.id), *
                            sku_id_list) if selected else redis_conn.srem(
                                'selected_{}'.format(user.id), *sku_id_list)

        else:
            cart = pickle.loads(
                base64.b64decode(request.COOKIES.get('carts').encode('utf-8')))
            if cart:
                for key in cart.keys():
                    cart[key]['selected'] = selected
                cart_dict = base64.b64decode(
                    pickle.dumps(cart)).decode('utf-8')

        response = http.JsonResponse({'code': 0, 'errormsg': 'info'})
        response.set_cookie('carts', cart_dict) if cart_dict else 0
        return response
Beispiel #3
0
    def delete(self, request):

        sku_id = json.loads(request.body.decode()).get('sku_id')

        user = request.user
        response = http.JsonResponse({'code': 0, 'errmsg': '删除购物车成功'})

        if user.is_authenticated:
            redis_conn = get_redis_connection('carts')
            pl = redis_conn.pipeline()
            pl.hdel('carts_{}'.format(user.id), sku_id)
            pl.srem('selected_%s' % user.id, sku_id)
            pl.execute()

        else:
            cart_dist = request.COOKIES.get('carts')
            cart_dist = pickle.loads(base64.b64decode(
                cart_dist.encode())) if cart_dist else {}
            if sku_id in cart_dist:
                del cart_dist[sku_id]
                cookie_cart_str = base64.b64encode(
                    pickle.dumps(cart_dist)).decode()
                response.set_cookie('carts',
                                    cookie_cart_str,
                                    max_age=24 * 30 * 3600)

        return response
Beispiel #4
0
    def delete(self, request):

        data = json.loads(request.body.decode())

        sku_id = data.get('sku_id')

        try:
            sku = SKU.objects.get(id=sku_id)

        except SKU.DoesNotExist:
            return http.JsonResponse({
                'code': RETCODE.NODATAERR,
                'errmsg': '没有此商品'
            })

        user = request.user

        if user.is_authenticated:
            redis_conn = get_redis_connection('carts')

            redis_conn.hdel('carts_%s' % user.id, sku_id)

            redis_conn.srem('selected%s' % user.id, sku_id)

            return http.JsonResponse({
                'code': RETCODE.OK,
                'errmsg': 'ok',
            })
        else:

            cookie_str = request.COOKIES.get('carts')
            if cookie_str is not None:
                cookie_dict = base64.b64decode(pickle.loads(cookie_str))
            else:
                cookie_dict = {}

            if sku_id in cookie_dict:

                del cookie_dict[sku_id]

            cookie_data = base64.b64encode(pickle.dumps(cookie_dict))

            response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'ok'})

            response.set_cookie('carts', cookie_data, max_age=3600)

            return response
Beispiel #5
0
    def post(self, request):
        data = json.loads(request.body.decode())
        sku_id = data.get('sku_id')
        count = data.get('count')
        selected = data.get('selected', True)
        if not all([count, sku_id]):
            return http.JsonResponse({'code': 1, 'errormsg': 'error'})
        try:
            count = int(count)
            a = SKU.objects.get(id=sku_id)
        except Exception as e:
            return http.JsonResponse({'code': 1, 'errormsg': 'error'})
        if selected:
            if not isinstance(selected, bool):
                return http.HttpResponseForbidden('参数selected有误')
        user = request.user
        if user.is_authenticated:
            redis_conns = get_redis_connection('carts')
            pl = redis_conns.pipeline()
            pl.hincrby('carts_%s' % user.id, sku_id, count)
            if selected:
                pl.sadd('selected_%s' % user.id, sku_id)
                # 执行管道
            pl.execute()
            # 响应结果
            return http.JsonResponse({'code': 0, 'errmsg': '添加购物车成功'})
        else:
            cookies_str = request.COOKIES.get('carts')
            if cookies_str:
                str_bytes = cookies_str.encode()
                str_bytes = base64.b64decode(str_bytes)
                cart_dict = pickle.loads(str_bytes)

            else:
                cart_dict = {}

            if sku_id in cart_dict:
                count += cart_dict.get(sku_id)['count']

            cart_dict[sku_id] = {'count': count, 'selected': selected}
            cart_dict = pickle.dumps(cart_dict)
            cart_dict = base64.b64encode(cart_dict)
            cart_dict = cart_dict.decode('utf-8')

            response = http.JsonResponse({'code': 0, 'error_msg': '0000000'})
            response.set_cookie('carts', cart_dict, max_age=24 * 30 * 3600)
            return response
Beispiel #6
0
    def put(self, request):

        data = json.loads(request.body.decode())

        sku_id = data.get('sku_id')
        count = data.get('count')
        selected = data.get('selected')

        if not all([sku_id, count, selected]):

            return http.JsonResponse({
                'code': RETCODE.NODATAERR,
                'errmsg': '参数不足'
            })

        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:

            return http.JsonResponse({
                'code': RETCODE.PARAMERR,
                'errmsg': '此商品不存在'
            })

        user = request.user

        if user.is_authenticated:

            redis_conn = get_redis_connection('carts')
            if selected:
                redis_conn.hset(
                    'carts_%s' % user.id,
                    sku_id,
                    count,
                )
            else:
                redis_conn.sadd(
                    'selected_%s' % user.id,
                    sku_id,
                )

            data = {
                'count': count,
                'id': sku_id,
                'selected': selected,
                'name': sku.name,
                'default_image_url': sku.default_image.url,
                'price': sku.price,
                'amount': sku.price * count,
            }

            return http.JsonResponse({
                'code': RETCODE.OK,
                'errmsg': 'OK',
                'cart_str': data
            })

        else:

            cookie_str = request.COOKIES.get('carts')
            if cookie_str is not None:
                cookie_dict = pickle.loads(base64.b64decode(cookie_str))

            else:
                cookie_dict = {}

            for sku_id, in cookie_dict:
                cookie_dict[sku_id] = {
                    'count': count,
                    'selected': selected,
                }

            cookie_data = base64.b64encode(pickle.dumps(cookie_dict))

            data = {
                'count': count,
                'id': sku_id,
                'selected': selected,
                'name': sku.name,
                'default_image_url': sku.default_image.url,
                'price': sku.price,
                'amount': sku.price * count,
            }

            response = http.JsonResponse({
                'code': RETCODE.OK,
                'errmsg': 'ok',
                'cart_str': data
            })

            response.set_cookie('carts', cookie_data, max_age=3600)

            return response
Beispiel #7
0
    def post(self, request):

        data = json.loads(request.body.decode())
        sku_id = data.get('sku_id')
        count = data.get('count')

        if not all([sku_id, count]):
            return http.JsonResponse({
                'code': RETCODE.NODATAERR,
                'errmsg': '参数不全'
            })

        try:
            sku = SKU.objects.get(id=sku_id)

        except SKU.DoesNotExist:
            return http.JsonResponse({
                'code': RETCODE.PARAMERR,
                'errmsg': '此商品不存在'
            })

        user = request.user

        if user.is_authenticated:

            redis_conn = get_redis_connection('carts')

            redis_conn.hset('carts_%s' % user.id, sku_id, count)

            redis_conn.sadd('selected_%s' % user.id, sku_id)

            selected = True

            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '添加购物车成功'})

        else:
            cookie_str = request.COOKIES.get('carts')

            if cookie_str is None:
                cookie_data = {sku_id: {'count': count, "selected": True}}
            else:
                cookie_base = base64.b64decode(cookie_str)
                cookie_data = pickle.loads(cookie_base)

                if sku_id in cookie_data:
                    origin_count = cookie_data[sku_id]['count']

                    count += origin_count

                    cookie_data[sku_id] = {'count': count, 'selected': True}

                else:
                    cookie_data[sku_id] = {'count': count, 'selected': True}

                cookie_str = base64.b64encode(pickle.dumps(cookie_data))

                response = http.JsonResponse({
                    'code': RETCODE.OK,
                    'errmsg': 'ok'
                })

                response.set_cookie(request, cookie_str, max_age=3600)

                return response