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
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
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
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
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
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
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