Cookie 存储购物车数据

Cookie 存储购物车数据

背景:

当用户处于未登录状态时,可以浏览商品,查看详细商品信息,也可以添加购物车。

此时数据不能存在redis中,因为redis存储数据需要以用户的身份做标识,用户不登录就没有身份标识。

所以此时的数据应该存储在本地的数据存储位置,即cookie当中。

实现思路:

  • 客户端在详情页发送商品信息,商品信息经由vue封装成json,向服务器发送ajax请求。

  • 视图函数接收到ajax请求,以request.body.decode()方式接收数据并且解码。

  • 将获取的数据封装成字典,加密后存入cookie中。方式为: response.set_cookie('cart', cart_str, max_age=60 * 60 * 24 * 14),返回response,页面显示添加成功。

  • 客户端请求购物车,请求发送至服务器。

  • 视图函数从cookie中读取数据,将数据解码,封装成前台需要的数据格式。

  • 前台模板变量接收到数据,vue对其进行处理,最终渲染页面,显示购物车数据。

界面效果与Redis存储购物车数据相同,视图函数代码如下:

from django.shortcuts import render
from django.views import View
import json
from django import http
from carts.utils.code import RETCODE
from carts.utils import my_json 
from django_redis import get_redis_connection

class DetailsView(View):
    def get(self, request):
        return render(request, 'd.html')

class CartsView(View):  
    def get(self, request):
        c_list = []
        cart_str = request.COOKIES.get('cart')
        if cart_str is None:
            context = {
                'v_js_carts':c_list
            }
            return render(request, 'c.html', context)
        cart_dict = my_json.loads(cart_str)
        print(cart_dict)
        for k,v in cart_dict.items():
            c_d = {k:v}
            c_list.append(c_d)
        print(c_list)
        context = {
            'v_js_carts':c_list
        }
        return render(request, 'c.html', context)

    def post(self, request):
        # 1.接收
        # 接收这五个参数:
        # vmodel_skuamount :this.vmodel_skuamount,
        # vmodel_skucaption : this.vmodel_skucaption,
        # vmodel_skucount : this.vmodel_skucount,
        # vmodel_skuname : this.vmodel_skuname,
        # vmodel_skuprice : this.vmodel_skuprice
        param_dict = json.loads(request.body.decode())
        amount = param_dict.get('vmodel_skuamount')
        caption = param_dict.get('vmodel_skucaption')
        count = param_dict.get('vmodel_skucount')
        name = param_dict.get('vmodel_skuname')
        price = param_dict.get('vmodel_skuprice')

        
        # 2.验证
        if not all([amount, caption, count, name, price]):
            return http.JsonResponse({
                'code':RETCODE.PARAMERR,
                'errmsg':'参数不完整'
            })
        # 3.处理
        response = http.JsonResponse({
            'code':RETCODE.OK,
            'errmsg':'ok'
        })
        # 将数据存入cookie
        # 1.读取cookie中的购物车数据
        cart_str = request.COOKIES.get('cart')
        if cart_str is None: 
            cart_dict = {}
        else:
            cart_dict = my_json.loads(cart_str)
        # 2.增加新的商品信息
        cart_dict = {
            'amount':amount,
            'caption':caption,
            'count':count,
            'name':name,
            'price':price
        }
        # 3.将数据存入cookie中
        cart_str = my_json.dumps(cart_dict)
        response.set_cookie('cart', cart_str, max_age=60 * 60 * 24 * 14)
        # 4.响应
        return response

源码

原文地址:https://www.cnblogs.com/junsircoding/p/15665144.html