zoukankan      html  css  js  c++  java
  • 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
    

    源码

  • 相关阅读:
    【转载】 C#中使用Sum方法对List集合进行求和操作
    【转载】 C#中使用Count方法获取List集合中符合条件的个数
    【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体
    【转载】Windows检测到IP地址冲突
    【转载】Asp.Net MVC网站提交富文本HTML标签内容抛出异常
    java笔试题(4)
    Android -- TouchEvent的分发和截获方式
    SQL优化
    Android -- 经验分享(二)
    设计模式(十二)外观模式(结构型)
  • 原文地址:https://www.cnblogs.com/junsircoding/p/15665144.html
Copyright © 2011-2022 走看看