经过前两小节的了解,也知道了购物车的商品数据可以保存在 cookie 和 redis 中。同样是先要获取到商品的id,再到用户的购物车中查询到这条数据。会发现,存入到 cookie 的商品数据是 json 数据格式。
from django_redis import get_redis_connection
① 作为 cache backend 使用配置
在项目的 settings.py 文件中,为了使用 django-redis , 应该将 django cache setting 改成这样:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
② 删除购物车数据
class DeleteCartView(View):
"""删除购物车数据"""
def post(self, request):
sku_id = request.POST.get("sku_id") # 商品id
if not sku_id:
return JsonResponse({"code": 1, "message": "参数缺少"})
# 从购物车中删除数据
if not request.user.is_authenticated():
# 用户未登录 ,cookies
cart_json = request.COOKIES.get("cart")
if cart_json is not None:
cart = json.loads(cart_json)
# 如果购物车中有这个商品,则删除
if sku_id in cart:
del cart[sku_id]
response = JsonResponse({"code": 0, "message": "删除成功"})
response.set_cookie("cart", json.dumps(cart))
return response
else:
# 用户已登录,redis
redis_conn = get_redis_connection("default")
user_id = request.user.id
# 让redis删除sku_id对应的数据,如果redis中不存在,redis会忽略掉
redis_conn.hdel("cart_%s" % user_id, sku_id)
return JsonResponse({"code": 0, "message": "删除成功"})
③ 退出
将用户的session数据删除 ,使用logout将用户的session数据删除
class LogoutView(View):
"""退出"""
def get(self, request):
""""""
# 将用户的session数据删除 ,使用logout将用户的session数据删除
logout(request)
return redirect(reverse("goods:index"))