二十九、登陆时购物车合并(商品部分)

1、重写登录功能的业务逻辑
  • 在users/下添加merge_cart_cookie_to_redis合并购物车的方法
import pickle
import base64
from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, user, response):
    """
    合并请求用户的购物车数据,将未登录保存在cookie里的保存到redis中
    遇到cookie与redis中出现相同的商品时以cookie数据为主,覆盖redis中的数据
    :param request: 用户的请求对象
    :param user: 当前登录的用户
    :param response: 响应对象,用于清楚购物车cookie
    :return:
    """

    # 1、获取cookie
    cart_cookie = request.COOKIES.get('cart_cookie', None)
    # 2、判断cookie是否存在
    if cart_cookie is None:
        return response
    # 3、存在则解密 cart = {10: {‘count’:2, selected: True}。cart = {}
    cart = pickle.loads(base64.b64decode(cart_cookie))
    # 4、判断字典是否为空
    if not cart:
        return response
    # 5、不为空拆分数据
    # 6、哈希 对应字典 {sku_id: count,sku_id2:count2}
    cart_dict = {}
    # 7、集合 对应列表 选中[sku_id1, sku_id2]。未选中[sku_id3]
    sku_id = []  # 选中
    sku_id_none = []  # 未选中
    for skuid, data in cart.items():
        # 哈希
        cart_dict[skuid] = data['count']
        if data['selected']:
            sku_id.append(skuid)
        else:
            sku_id_none.append(skuid)
    # 8、写入redis
    conn = get_redis_connection('carts')
    conn.hmset('cart_%s' % user.id, cart_dict)
    if sku_id:
        conn.sadd('cart_selected_%s' % user.id, *sku_id)
    if sku_id_none:
        conn.srem('cart_selected_%s' % user.id, *sku_id_none)
    # 9、删除cookie
    response.delete_cookie('cart_cookie')

    return response

  • 在views下重写用户登录的视图函数

class UserLoginView(ObtainJSONWebToken):

    def post(self, request, *args, **kwargs):
        response=super().post(request, *args, **kwargs)

        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            user = serializer.object.get('user') or request.user
            # 合并购物车
            response=merge_cart_cookie_to_redis(request,user,response)

        return response

2、修改登陆子路由

urlpatterns = [
    ...
    # url(r'^authorizations/$', obtain_jwt_token), 
    url(r'^authorizations/$', views.UserAuthorizeView.as_view()),
    ...
]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值