进入到redis解压目录
命令行运行redis-server.exe redis.windows.conf
# redis 连接池
POOL = redis.ConnectionPool(host='127.0.0.1',
port=6379,
decode_responses=True)
REDIS_CONN = redis.Redis(connection_pool=POOL)
class ShoppingCarView(APIView):
authentication_classes = [authentication.MyAuthentication, ]
@staticmethod
def post(request):
my_res = BaseResponse()
# {"course_id": 1, "price_policy_id": 1}
try:
"""1.判断课程是否合法"""
course_id = request.data.get('course_id', '')
course_obj = models.Course.objects.filter(id=course_id).first()
if not course_obj:
raise MyException(101, '课程非法或不存在!')
"""2.判断价格策略是否合法"""
price_policy_id = request.data.get('price_policy_id', '')
all_price_policy_query_set = course_obj.price_policy.all()
if not all_price_policy_query_set.filter(id=price_policy_id).first():
raise MyException(102, '价格策略不合法')
"""3.拿到课程信息"""
course_info = {
'title': course_obj.title,
'course_img': str(course_obj.course_img),
'category': course_obj.category.title,
'course_type': course_obj.get_course_type_display(),
'brief': course_obj.brief,
'level': course_obj.get_level_display(),
}
"""4.拿到所有的价格策略"""
price_policy_dict = {}
for price_policy_obj in all_price_policy_query_set.order_by('price'):
price_policy_dict[price_policy_obj.id] = {
'valid_period': price_policy_obj.get_valid_period_display(),
'price': price_policy_obj.price
}
"""5.组建购物车"""
shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
course_info['price_policy_dict'] = price_policy_dict
course_info['default_price_policy_id'] = price_policy_id
"""6.将组建好的购物车写进 Redis"""
course_info = json.dumps(course_info)
REDIS_CONN.set(shopping_car_key, course_info)
my_res.code = 100
my_res.msg = '加入购物车成功!'
except MyException as e:
my_res.code = e.code
my_res.msg = e.msg
except Exception as e:
my_res.code = -100
my_res.msg = str(e)
return Response(my_res.dict)
@staticmethod
def get(request):
my_res = BaseResponse()
try:
user_id = request.user.pk
shopping_car_key = SHOPPING_CAR.format(user_id, '*')
"""找到所有的keys"""
all_shopping_car_keys = REDIS_CONN.scan_iter(shopping_car_key)
if not all_shopping_car_keys:
raise MyException(201, '购物车不存在')
shopping_car = {}
for key in all_shopping_car_keys:
shopping_car[key] = json.loads(
REDIS_CONN.get(key)
)
my_res.code = 200
my_res.msg = 'SUCCESS'
my_res.data = shopping_car
except MyException as e:
my_res.code = e.code
my_res.msg = e.msg
except Exception as e:
my_res.code = -200
my_res.msg = str(e)
return Response(my_res.dict)
@staticmethod
def put(request):
my_res = BaseResponse()
# {"course_id": 1, "price_policy_id": 1}
try:
"""1.检查课程id是否存在于redis中"""
course_id = request.data.get('course_id', '')
shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
if not REDIS_CONN.exists(shopping_car_key):
raise MyException(301, '购物车不存在此课程')
"""2.判断价格策略是否合法"""
price_policy_id = request.data.get('price_policy_id', '')
price_policy_query_set = models.Course.objects.filter(id=course_id).first().price_policy.all()
if not price_policy_query_set.filter(id=price_policy_id):
raise MyException(402, '价格策略不合法')
"""3.从Redis里面找到该用户的购物车,修改后重新写进 Redis"""
shopping_car = json.loads(REDIS_CONN.get(shopping_car_key))
shopping_car['default_price_policy_id'] = price_policy_id
REDIS_CONN.set(shopping_car_key, json.dumps(shopping_car, ensure_ascii=True))
my_res.code = 400
my_res.msg = 'SUCCESS'
my_res.data = shopping_car
except MyException as e:
my_res.code = e.code
my_res.msg = e.msg
except Exception as e:
my_res.code = -400
my_res.msg = str(e)
return Response(my_res.dict)
@staticmethod
def delete(request):
# 版本优化批量删除
my_res = BaseResponse()
try:
"""获取课程id,判断是否在Redis中"""
course_id = request.data.get('course_id', '')
shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
if not REDIS_CONN.exists(shopping_car_key):
raise MyException(501, '购物车不存在此课程')
REDIS_CONN.delete(shopping_car_key)
my_res.code = 500
my_res.msg = '删除成功!'
except MyException as e:
my_res.code = e.code
my_res.msg = e.msg
except Exception as e:
my_res.code = -500
my_res.code = str(e)
return Response(my_res.dict)
shopping_car = {
# 购物车数据结构
"shopping_car_ {}_ {}": {
"id": "XXX",
"title": "XXX",
"course_img": "XXX",
"price_policy_dict": {
"valid_period": "XXX",
"price": "XXX"
},
"default_price_policy_id": "XXX"
},
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。