获取推荐商品思路

cookic版

1. 我们可以直接在功能中写这功能, 但是考虑到耦合性(一个功能代码有点长), 所以使用装饰器的方法

def recommend_view(func):
    def wrapper(detailView,request,goodsid,*args,**kwargs):
   
        return func(detailView,request,goodsid,*args,**kwargs)

    return wrapper


class DetailView(View):
    @recommend_view
    def get(self,request,goodsid):

        goodsid = int(goodsid)

        #根据goodsid查询商品详情信息(goods对象)
        goods = Goods.objects.get(id=goodsid)
    
        content = {'goods': goods}
        return render(request, 'detail.html', content)
View Code

 

2. 每次点击都要先获取客服端保存的cookie中的客户id, 并把它保存在一个列表中

def recommend_view(func):
    def wrapper(detailView,request,goodsid,*args,**kwargs):
        #将存放在cookie中的goodsId获取
        cookie_str = request.COOKIES.get('recommend','')

        #存放所有goodsid的列表
        goodsIdList = [gid for gid in cookie_str.split() if gid.strip()]

        return func(detailView,request,goodsid,*args,**kwargs)

    return wrapper


class DetailView(View):
    @recommend_view
    def get(self,request,goodsid):

        goodsid = int(goodsid)

        #根据goodsid查询商品详情信息(goods对象)
        goods = Goods.objects.get(id=goodsid)
    
        content = {'goods': goods}
        return render(request, 'detail.html', content)
View Code

 

3. 我们要返回什么数据, 一个包含商品对象的列表goodsObjList

  判断该商品是否存在cookie中, 存在则删除重新添加到首位, 不存在则添加到首位

  返回的对象: 1. 不能包含当前商品     2. 只能是当前类别的商品   3. 最多取四条 

def recommend_view(func):
    def wrappeer(detailView, request, goodsid, *args, **kwargs):
        cookie_str = request.COOKIES.get('recommend', '')

        # 存放所有goodsid的列表
        goodsIdList = [gid for gid in cookie_str.split() if gid.strip()]

        # 最终需要获取的推荐商品
        goodsObjList = [Goods.objects.get(id=gsid) for gsid in goodsIdList if
                        gsid != goodsid and Goods.objects.get(id=gsid).category_id == Goods.objects.get(
                            id=goodsid).category_id][:4]

        # 判断goodsid是否存在goodsIdList中
        if goodsid in goodsIdList:
            goodsIdList.remove(goodsid)
            goodsIdList.insert(0, goodsid)
        else:
            goodsIdList.insert(0, goodsid)

        return func(detailView,request,goodsid,*args,**kwargs)

    return wrappeer


class DetailView(View):
    @recommend_view
    def get(self, request, goodsid):
        goodsid = int(goodsid)
        goods = Goods.objects.get(id=goodsid)

        content = {'goods': goods}
        return render(request, 'detail.html', content)
View Code

 

4.  将返回的数据保存在cookie中

  装饰器最后返回的func, 就是当前的get, 所以直接使用一个变量response接收func(detailView, request, goodsObjList, *args, **kwargs), 然后设置cookie

  def wrappeer(detailView, request, goodsid, *args, **kwargs):
        cookie_str = request.COOKIES.get('recommend', '')
        # 存放所有goodsid的列表
        goodsIdList = [gid for gid in cookie_str.split() if gid.strip()]
        # 最终需要获取的推荐商品
        goodsObjList = [Goods.objects.get(id=gsid) for gsid in goodsIdList if
                        gsid != goodsid and Goods.objects.get(id=gsid).category_id == Goods.objects.get(
                            id=goodsid).category_id][:4]

        # 判断goodsid是否存在goodsIdList中
        if goodsid in goodsIdList:
            goodsIdList.remove(goodsid)
            goodsIdList.insert(0, goodsid)
        else:
            goodsIdList.insert(0, goodsid)

        # 将goodsObjList传递给get方法
        response = func(detailView, request, goodsid, goodsObjList, *args, **kwargs)

        # 将goodsIdList中的数据保存在cookie中
        response.set_cookie('recommend', ' '.join(goodsIdList), max_age=60 * 60 * 24 * 7)

        return response

    return wrappeer


class DetailView(View):
    @recommend_view
    def get(self, request, goodsid, recommendList=[]):
        goodsid = int(goodsid)
        goods = Goods.objects.get(id=goodsid)

        content = {'goods': goods, 'recommendList':recommendList}
        return render(request, 'detail.html', content)
View Code

 

posted @ 2020-03-29 01:45  yyfgrd  阅读(158)  评论(0)    收藏  举报