購物車全選
阿新 • • 發佈:2018-07-31
base 請求參數 expires tab connect 用戶 response json span
1. 後端接口設計
請求方式 : PUT /cart/selection/
請求參數: JSON 或 表單
參數 | 類型 | 是否必須 | 說明 |
---|---|---|---|
selected | bool | 是 | 是否全選,true表示全選,false表示取消全選 |
返回數據:JSON
返回值 | 類型 | 是否必須 | 說明 |
---|---|---|---|
message | str | 是 | ok |
2. 後端實現
在carts/serializers.py中新建序列化器
class CartSelectAllSerializer(serializers.Serializer):
"""
購物車全選
"""
selected = serializers.BooleanField(label=‘全選‘)
在carts/views.py中新建視圖
class CartSelectAllView(APIView):
"""
購物車全選
"""
def perform_authentication(self, request):
"""
重寫父類的用戶驗證方法,不在進入視圖前就檢查JWT
"""
pass
def put(self, request):
serializer = CartSelectAllSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
selected = serializer.validated_data[‘selected‘]
try:
user = request.user
except Exception:
# 驗證失敗,用戶未登錄
user = None
if user is not None and user.is_authenticated:
# 用戶已登錄,在redis中保存
redis_conn = get_redis_connection(‘cart‘)
cart = redis_conn.hgetall(‘cart_%s‘ % user.id)
sku_id_list = cart.keys()
if selected:
# 全選
redis_conn.sadd(‘cart_selected_%s‘ % user.id, *sku_id_list)
else:
# 取消全選
redis_conn.srem(‘cart_selected_%s‘ % user.id, *sku_id_list)
return Response({‘message‘: ‘OK‘})
else:
# cookie
cart = request.COOKIES.get(‘cart‘)
response = Response({‘message‘: ‘OK‘})
if cart is not None:
cart = pickle.loads(base64.b64decode(cart.encode()))
for sku_id in cart:
cart[sku_id][‘selected‘] = selected
cookie_cart = base64.b64encode(pickle.dumps(cart)).decode()
# 設置購物車的cookie
# 需要設置有效期,否則是臨時cookie
response.set_cookie(‘cart‘, cookie_cart, max_age=constants.CART_COOKIE_EXPIRES)
return response
購物車全選