我们在浏览网页的时候经常会在购买商品的时候,发现有个最近浏览记录,显示你浏览过的商品,这些都是怎么做的?
其实主要用是cookie技术。
通常,每查看一个商品的详细信息,我们算作一次浏览记录。
假设下面为我们的商品详情页逻辑。
def detail(request,id):
'''
商品详情页
:param request:
:return:
'''
goods = GoodsInfo.objects.get(id=id)
goods.g_click += 1
goods.save()
# 获取新品推荐的商品
news_goods = GoodsInfo.objects.all().order_by('-id')[:2]
title = '天天生鲜-{}'.format(goods.g_title)
is_detail = 1
has_cart = 1
goods = goods
response = render(request,'fs_goods/detail.html',locals())
那么接下来我们就需要先从本地cookies获取该商品的浏览记录信息,如果有记录则直接获取,反之就把当前这个商品作为浏览记录保存到cookies中。
cookies = request.COOKIES.get('goods_cookies','')
紧接着做出判断,
if cookies == '':
# 说明是第一次浏览商品详情,本地还没有生成商品的cookie信息,那么直接将这个商品的id存到cookie。
cookies = id+';' # '1;2;3;'
elif cookies != '':
# 说明不是第一次浏览商品详情,本地已经存在商品的cookie信息了;
# 从'1;2;3;'这个cookie字符串中,取出每一个商品的id
goods_id_list = cookies.split(';') # ['1','2','3']
# 判断当前浏览的这个商品的id是否存在于这个goods_id列表中,存在说明商品之前浏览过,不存在说明之前没有浏览过 。
对于浏览记录,平时我们看到的大抵有两种。一是只考虑cookie是否存在,不考虑顺序问题。二是考虑cookie是否存在,同时考虑顺序问题,将最近点击的商品记录展示在最前面。
(1)、第一种方案,只考虑cookie是否存在,不考虑顺序问题
if id in goods_id_list:
return response
else:
goods_id_list.insert(0,id)
cookies = ';'.join(goods_id_list)
response.set_cookie('goods_cookies',cookies)
return response
(2)、第二种方案,考虑cookie是否存在,同时考虑顺序问题,将最近点击的商品记录展示在最前面。(假设我们最近浏览记录只展示5条)
if id in goods_id_list:
# 说明当前这个商品记录已经存在了,将这个记录从cookie中删除
goods_id_list.remove(id)
goods_id_list.insert(0,id)
if len(goods_id_list) >= 6:
goods_id_list = goods_id_list[:5]
cookies = ';'.join(goods_id_list)
response.set_cookie('goods_cookies', cookies)
return response
最后将其从cookie中取出,将其展示到需要的地方。
# 从本地cookie读取商品的浏览记录
cookies = request.COOKIES.get('goods_cookies','')
goods_list = []
if cookies != '':
goods_id_list = cookies.split(';')
for goods_id in goods_id_list:
if goods_id:
good = GoodsInfo.objects.get(id=int(goods_id))
goods_list.append(good)
else:
continue
return render(request, 'fs_user/user_center_info.html', locals())