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:
"""
cart_cookie = request.COOKIES.get('cart_cookie', None)
if cart_cookie is None:
return response
cart = pickle.loads(base64.b64decode(cart_cookie))
if not cart:
return response
cart_dict = {}
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)
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)
response.delete_cookie('cart_cookie')
return response
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/$', views.UserAuthorizeView.as_view()),
...
]