購物車中心前端
用戶點擊價格策略加入購物車,我的中心能夠查看本身全部購物車中數據redis
在購物車中能夠刪除課程,還能夠更新購物車中課程的價格策略django
因此接口應該有四種請求方式, get,post,patch,deletejson
購物車是屬於中間狀態數據,並且不少時候須要過時時間,因此咱們選擇redis數據結構
讀取速度快,而且redis能夠作持久化,支持的數據類型也比較多。app
要點:將購物車數據組織放到reids中,reids的增刪改查對應http的四種請求方法 。對購物車操做前需驗證。ide
# 前端傳過來的數據結構
{ course_id , price_policy_id}
# 把購物車數據放入redis中的結構 """ { SHOPPINGCAR_USERID_COURSE_ID: { "id", "title", "course_img", "price_policy_dict": { price_policy_id: "{valid_period, price}" price_policy_id2: "{valid_period, price}" price_policy_id3: "{valid_period, price}" }, "default_price_policy_id": 1 } } """
""" 購物車接口 1010 表明成功 1011 課程不存在 1012 價格策略不存在 1013 獲取購物車失敗 1014 刪除的購物車數據不存在 """
from rest_framework.views import APIView from rest_framework.response import Response from utils.base_response import BaseResponse from utils.my_auth import LoginAuth from utils.redis_pool import POOL from Course.models import Course import json import redis SHOPPINGCAR_KEY = "SHOPPINGCAR_%s_%s" CONN = redis.Redis(connection_pool=POOL) class ShoppingCarView(APIView): authentication_classes = [LoginAuth, ] def post(self, request): res = BaseResponse() # 1, 獲取前端傳過來的數據以及user_id course_id = request.data.get("course_id", "") price_policy_id = request.data.get("price_policy_id", "") user_id = request.user.pk # 2, 校驗數據的合法性 # 2.1 校驗課程id合法性 course_obj = Course.objects.filter(id=course_id).first() if not course_obj: res.code = 1040 res.error = "課程id不合法" return Response(res.dict) # 2.2 校驗價格策略id是否合法 price_policy_queryset = course_obj.price_policy.all() price_policy_dict = {} for price_policy in price_policy_queryset: price_policy_dict[price_policy.id] = { "price": price_policy.price, "valid_period": price_policy.valid_period, "valid_period_display": price_policy.get_valid_period_display() } if price_policy_id not in price_policy_dict: res.code = 1041 res.error = "價格策略id不合法" return Response(res.dict) # 3,構建redisKEY key = SHOPPINGCAR_KEY % (user_id, course_id) # 4,構建數據結構 course_info = { "id": course_obj.id, "title": course_obj.title, "course_img": str(course_obj.course_img), "price_policy_dict": json.dumps(price_policy_dict, ensure_ascii=False), "default_price_policy_id": price_policy_id } # 5 寫入redis CONN.hmset(key, course_info) res.data = "加入購物車成功" return Response(res.dict)
接口測試post
def get(self, request): res = BaseResponse() # 1, 拼接redis key user_id = request.user.pk shopping_car_key = SHOPPINGCAR_KEY % (user_id, "*") # 購物車可能 # 2, 去redis中讀取數據 # 2.1 匹配全部的keys # 3,構建數據結構展現 all_keys = CONN.scan_iter(shopping_car_key) # redis 掃描類似的 ret = [] for key in all_keys: ret.append(CONN.hgetall(key)) res.data = ret return Response(res.dict)
更新購物車中課程的價格策略測試
PUT以及DELETE接口spa
def put(self, request): # 前端 course_id price_policy_id res = BaseResponse() # 1, 獲取前端傳過來的數據以及user_id course_id = request.data.get("course_id", "") price_policy_id = request.data.get("price_policy_id", "") user_id = request.user.pk # 2, 校驗數據的合法性 # 2.1 course_id是否合法 key = SHOPPINGCAR_KEY % (user_id, course_id) if not CONN.exists(key): res.code = 1043 res.error = "課程id不合法" return Response(res.dict) # 2,2 price_policy_id是否合法 price_policy_dict = json.loads(CONN.hget(key, "price_policy_dict")) print(price_policy_dict) if str(price_policy_id) not in price_policy_dict: res.code = 1044 res.error = "價格策略不合法" return Response(res.dict) # 3, 更新redis default_price_policy_id CONN.hset(key, "default_price_policy_id", price_policy_id) res.data = "更新成功" return Response(res.dict)
這裏多是一到多個課程,所以將課程id存到一個列表裏面
def delete(self, request): # course_list = [course_id, ] res = BaseResponse() # 1 獲取前端傳來的數據以及user_id course_list = request.data.get("course_list", "") user_id = request.user.pk # 2 校驗course_id是否合法 for course_id in course_list: key = SHOPPINGCAR_KEY % (user_id, course_id) if not CONN.exists(key): res.code = 1045 res.error = "課程ID不合法" return Response(res.dict) # 3, 刪除redis數據 CONN.delete(key) res.data = "刪除成功" return Response(res.dict)
from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from utils.base_response import BaseResponse from utils.my_auth import LoginAuth from utils.redis_pool import POOL from Course.models import Course import json import redis # Create your views here. # 前端傳過來 course_id price_policy_id # 把購物車數據放入redis """ { SHOPPINGCAR_USERID_COURSE_ID: { "id", "title", "course_img", "price_policy_dict": { price_policy_id: "{valid_period, price}" price_policy_id2: "{valid_period, price}" price_policy_id3: "{valid_period, price}" }, "default_price_policy_id": 1 } } """ SHOPPINGCAR_KEY = "SHOPPINGCAR_%s_%s" CONN = redis.Redis(connection_pool=POOL) class ShoppingCarView(APIView): authentication_classes = [LoginAuth, ] def post(self, request): res = BaseResponse() # 1, 獲取前端傳過來的數據以及user_id course_id = request.data.get("course_id", "") price_policy_id = request.data.get("price_policy_id", "") user_id = request.user.pk # 2, 校驗數據的合法性 # 2.1 校驗課程id合法性 course_obj = Course.objects.filter(id=course_id).first() if not course_obj: res.code = 1040 res.error = "課程id不合法" return Response(res.dict) # 2.2 校驗價格策略id是否合法 price_policy_queryset = course_obj.price_policy.all() price_policy_dict = {} for price_policy in price_policy_queryset: price_policy_dict[price_policy.id] = { "price": price_policy.price, "valid_period": price_policy.valid_period, "valid_period_display": price_policy.get_valid_period_display() } if price_policy_id not in price_policy_dict: res.code = 1041 res.error = "價格策略id不合法" return Response(res.dict) # 3,構建redisKEY key = SHOPPINGCAR_KEY % (user_id, course_id) # 4,構建數據結構 course_info = { "id": course_obj.id, "title": course_obj.title, "course_img": str(course_obj.course_img), "price_policy_dict": json.dumps(price_policy_dict, ensure_ascii=False), "default_price_policy_id": price_policy_id } # 5 寫入redis CONN.hmset(key, course_info) res.data = "加入購物車成功" return Response(res.dict) def get(self, request): res = BaseResponse() # 1, 拼接redis key user_id = request.user.pk shopping_car_key = SHOPPINGCAR_KEY % (user_id, "*") # 2, 去redis中讀取數據 # 2.1 匹配全部的keys # 3,構建數據結構展現 all_keys = CONN.scan_iter(shopping_car_key) ret = [] for key in all_keys: ret.append(CONN.hgetall(key)) res.data = ret return Response(res.dict) def put(self, request): # 前端 course_id price_policy_id res = BaseResponse() # 1, 獲取前端傳過來的數據以及user_id course_id = request.data.get("course_id", "") price_policy_id = request.data.get("price_policy_id", "") user_id = request.user.pk # 2, 校驗數據的合法性 # 2.1 course_id是否合法 key = SHOPPINGCAR_KEY % (user_id, course_id) if not CONN.exists(key): res.code = 1043 res.error = "課程id不合法" return Response(res.dict) # 2,2 price_policy_id是否合法 price_policy_dict = json.loads(CONN.hget(key, "price_policy_dict")) print(price_policy_dict) if str(price_policy_id) not in price_policy_dict: res.code = 1044 res.error = "價格策略不合法" return Response(res.dict) # 3, 更新redis default_price_policy_id CONN.hset(key, "default_price_policy_id", price_policy_id) res.data = "更新成功" return Response(res.dict) def delete(self, request): # course_list = [course_id, ] res = BaseResponse() # 1 獲取前端傳來的數據以及user_id course_list = request.data.get("course_list", "") user_id = request.user.pk # 2 校驗course_id是否合法 for course_id in course_list: key = SHOPPINGCAR_KEY % (user_id, course_id) if not CONN.exists(key): res.code = 1045 res.error = "課程ID不合法" return Response(res.dict) # 3, 刪除redis數據 CONN.delete(key) res.data = "刪除成功" return Response(res.dict)