第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.id
pl.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())

被折叠的 条评论
为什么被折叠?



