登錄合並購物車


在用戶登錄時,將cookie中的購物車數據合並到redis中,並清除cookie中的購物車數據。

普通登錄和QQ登錄都要合並,所以將合並邏輯放到公共函數里實現。

在carts/utils.py中創建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中 :param request: 用戶的請求對象 :param user: 當前登錄的用戶 :param response: 響應對象,用於清楚購物車cookie :return: """ cookie_cart = request.COOKIES.get('cart') if cookie_cart is not None: cookie_cart = pickle.loads(base64.b64decode(cookie_cart.encode())) redis_conn = get_redis_connection('cart') redis_cart = redis_conn.hgetall('cart_%s' % usert.id) redis_cart_selected = redis_conn.smembers('cart_selected_%s' % user.id) cart = {} for sku_id, count in redis_cart.items(): cart[int(sku_id)] = int(count) for sku_id, count_selected_dict in cookie_cart.items(): cart[sku_id] = count_selected_dict['count'] if count_selected_dict['selected']: redis_cart_selected.add(sku_id) if cart: pl = redis_conn.pipeline() pl.hmset('cart_%s' % user.id, cart) pl.sadd('cart_selected_%s' % user.id, *redis_cart_selected) pl.execute() response.delete_cookie('cart') return response 

修改登錄視圖

rest_framework_jwt提供的obtain_jwt_token視圖,實際從rest_framework_jwt.views.ObtainJSONWebToken類視圖而來,我們可以重寫此類視圖里的post方法來添加合並邏輯

from rest_framework_jwt.views import ObtainJSONWebToken class UserAuthorizeView(ObtainJSONWebToken): """ 用戶認證 """ def post(self, request, *args, **kwargs): # 調用父類的方法,獲取drf jwt擴展默認的認證用戶處理結果 response = super().post(request, *args, **kwargs) # 仿照drf jwt擴展對於用戶登錄的認證方式,判斷用戶是否認證登錄成功 # 如果用戶登錄認證成功,則合並購物車 serializer = self.get_serializer(data=request.data) if serializer.is_valid(): user = serializer.validated_data.get('user') response = merge_cart_cookie_to_redis(request, user, response) return response 

修改路徑users/urls.py

urlpatterns = [
    ...
    # url(r'^authorizations/$', obtain_jwt_token), url(r'^authorizations/$', views.UserAuthorizeView.as_view()), ... ]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM