第16次:用户浏览记录
第1步:配置redis缓存
用户的浏览历史应存放在基于内存的redis,而非基于磁盘的mysql中,所以需要配置存放浏览历史的redis 3号缓存库。
在settings.py中缓存配置项中增加如下:
'history': {'BACKEND': 'django_redis.cache.RedisCache','LOCATION': 'redis://127.0.0.1:6379/3','OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient',}
}
第2步:保存与查询浏览记录
在users/views.py中增加如下代码
class UserBorwseHistory(LoginRequiredJSONMixin, View):"""用户浏览记录"""def get(self, request):"""获取用户浏览记录"""# 从redis取sku_id列表redis_conn = get_redis_connection('history')sku_ids = redis_conn.lrange('history_%s' % request.user.id, 0, -1)# 查询商品信息skus = []for sku_id in sku_ids:sku = SKU.objects.get(id=sku_id)skus.append({'id': sku.id,'name': sku.name,'default_image_url': 'http://localhost:8000/'+settings.STATIC_URL + 'images/goods/' + sku.default_image.url + '.jpg','price': sku.price})return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'skus': skus})def post(self, request):# 保存浏览记录,detail.html页面会通过vue的mounted回调函数,在渲染时保存商品信息# 接收参数json_dict = json.loads(request.body.decode())sku_id = json_dict.get('sku_id')# 参数校验try:SKU.objects.get(id=sku_id)except SKU.DoesNotExist:return HttpResponseForbidden('sku不存在')# 保存redis_conn = get_redis_connection('history')pl = redis_conn.pipeline()user_id = request.user.idpl.lrem('history_%s' % user_id, 0, sku_id) # 去重pl.lpush('history_%s' % user_id, sku_id) # 存储pl.ltrim('history_%s' % user_id, 0, 4) # 最后截取pl.execute()return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})
第3步:在users应用下urls.py增加路由模式
path('browse_histories/', views.UserBorwseHistory.as_view())