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/lulujunsir/p/carts_cookie.html
时间: 2024-10-06 16:45:40