购物车模块实现
-
添加到购物车: 对前端发送的sku_id, count, selected进行相应的存储
# 先定义序列化器, 用途是对sku_id,count进行验证 class CartSerializer(serializers.Serializer): sku_id = serializers.IntegerField(min_value=1) count = serializers.IntegerField(min_value=1) selected = serializers.BooleanField(default=True) def validate(self,attrs): try: sku = SKU.objects.get(id=atttrs['sku_id']) except: raise serializers.ValidationError('商品不存在') if count > sku.stock: raise serializers.ValidationError('库存不足') return attrs # 定义视图, 实现业务逻辑 class CartView(APIView): # 重写验证方法, 不在进入视图前就检查JWT def perform_authentication(self, request): pass # 在商品详情页添加购物车 def post(self,request): serializer=CartSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 获取数据 sku_id=request.data.get('sku_id') count=request.data.get('count') selected=request.data.get('selected') # 判断用户登录 try: user=request.user except: user=None if user: # 在redis中存储,redis存储的数据不需要加密 conn = get_redis_connection('cart') conn.hincrby('cart_%s'%user.id,sku_id,count) if selected: conn.sadd('cart_selected_%s'%user.id,sku_id) return Response(serializer.data) else: cart=request.COOKIES.get('cart') if cart: cart=pickle.loads(base64.b64decode(cart)) else: cart={ } sku = cart.get(sku_id) if sku: count+=int(sku.get('count')) cart[sku_id]={ 'count':count, 'selected':selected } cart_cookie=base64.b64encode(pickle.dumps(cart)) response