create接口流程

需求:向购物车添加商品
流程:写shopping_cart路由--->写ShoppingCart视图函数--->使用Authuser校验用户是否登录--->首先写添加create--->
使用异常的格式,逻辑代码写在try里,报错涉及到用户认证错误,课程不存在错误、价格策略不存在错误、还有正常错误1004--->
1.获取用户id--->获取课程id、价格策略id--->3.1校验课程是否存在---->
3.2校验课程价格策略是否合法---->4.在redis中存储数据

  1、登录校验

  2、获取课程id和价格策略id,校验课程id和价格策略id是否合法

  3、通过用户id、课程id将课程信息放入购物车

添加商品的数据结构

遇到的问题,存储的解构设计问题,刚开始字典套字典,存取都麻烦,后来设计的合理的解构:

#方案一
'''
user_id:{
shopping_car:{
course_id:{
name:"",
img:"",
price_plicy:{},
default_price_policy_id:3
}
}
} '''
#方案二
#用户1买的课程2
'''
shopping_car_1_2:{
name:"",
img:"",
price_policy:{},
default_price_policy_id:3 }
shopping_car_1_3:{
name:"",
img:"",
price_policy:{},
default_price_policy_id:3 }

添加接口-create

class ShoppingCart(ViewSetMixin, APIView):
#对添加购物车之前对用户信息做校验
authentication_classes = [UserAuth] def list(self, request, *args, **kwargs):
pass def create(self, request, *args, **kwargs): #添加到购物车
"""
提交post请求,将提交课程存放redis中 状态码:
1000 : 成功
1001 :认证失败
1002 : 课程不存在
1003 : 价格策略不存在 """ response=BaseResponse()
try: # 1 用户的ID
user_pk=request.user.pk # 2 获取课程ID和对应的价格策略ID
course_id=request.data.get("course_id")
price_policy_id=request.data.get("price_policy_id") # 3 校验数据合法性 # 3.1 校验课程是否存在
course_obj=Course.objects.get(pk=course_id) #如果遇见课程id不存在,
                                     直接会执行ObjectDoesNotExist这个异常 # 3.2 校验课程价格策略id是否合法
#查找课程的价格策略
price_policy_list=course_obj.price_policy.all()
#判断这个课程价格策略是否在数据库中 price_policy_dict={} #构造个字典为了判断价格策略id是否在price_plicy_list里
for price_policy in price_policy_list:
price_policy_dict[price_policy.pk]={
"prcie":price_policy.price,
"valid_period":price_policy.valid_period,
"valid_period_text":price_policy.get_valid_period_display(),
}
'''
price_policy_dict: # price_policy_dict的数据格式
{
1:{"price":100,"valid_period":60},
2:{"price":200,"valid_period":120},
} '''
if price_policy_id not in price_policy_dict:
raise PriceDoesNotExist
# 4.向redis存储
#方案一
'''
user_id:{
shopping_car:{
course_id:{
name:"",
img:"",
price_plicy:{},
default_price_policy_id:3
}
}
} '''
#方案二
'''
shopping_car_1_2:{
name:"",
img:"",
price_policy:{},
default_price_policy_id:3 }
shopping_car_1_3:{
name:"",
img:"",
price_policy:{},
default_price_policy_id:3 }
shopping_car_2_1:{
name:"",
img:"",
price_policy:{},
default_price_policy_id:3 } '''
#redis接口1
# import redis
# pool=redis.ConnectionPool(host="127.0.0.1",port="6379")
# redis=redis.Redis(connection_pool=pool)
#redis接口2
from django_redis import get_redis_connection
redis=get_redis_connection("default") #使用redis中get_redis_connection函数,
                                  在setting中配置default from django.conf import settings
import json
shopping_car_key=settings.SHOPPING_CAR_KEY%(user_pk,course_id)
  
       #向SHOPPING_CAR_KEY="shopping_car_%s_%s" 字典传入参数 course_info={
"name":course_obj.name,
"course_img":course_obj.course_img,
"relate_price_policy":json.dumps(price_policy_dict),
"default_price_policy_id":price_policy_id } #向redis中存储购物车商品数据
redis.hmset(shopping_car_key,course_info) response.data="添加购物车成功!" except ObjectDoesNotExist as e:
response.code="",
response.errot="课程不存在" except PriceDoesNotExist as e:
response.code="",
response.errot=e.error except Exception as e:
response.code="",
response.error=str(e) # 返回购物车商品数据
return Response(response.dict)

遇见的问题:

在使用redis存储数据时,构造数据结构时出现了问题,原因是使用字典套字典的格式,user_id, shopping_car, 
course_id\course_img\price_policy\default_price_policy 这样存储数据时一层套一层,想取到里边的值时很麻烦,
而且存储也不方便,于是使用了shopping_car_%s_%s这种格式,给传入user_id和course_id,
里边就是course_name,course_img,price_policy,default_price_policy方便存储。

create制作流程详细

a.校验买课的用户是否登录;

在AuthUser中获取到user.name,user.token进行校验

b.获取课程id和价格策略id;

从发来的请求中获取这俩值

c.校验数据合法性

d.向redis中存储

首先配置redis,在setting中配置,顺便启动redis服务端和客户端

# redis配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "密码",
}
}
}

redis的接口可以是以下俩种,一般第二个方便

#redis接口1
import redis
pool=redis.ConnectionPool(host="127.0.0.1",port="")
redis=redis.Redis(connection_pool=pool) redis接口2
from django_redis import get_redis_connection
redis=get_redis_connection("default") #使用redis中get_redis_connection函数,在setting中配置default

接着构造字典的键和值shopping_car_key和course_info,进行redis存储

redis.hmset(shopping_car_key,course_info)
测试效果

使用postman发送

    {
"course_id":1,
"price_policy_id":2
}

响应

{
"code": 1000,
"data": "添加购物车成功!",
"error": ""
}

使用redis进行查询

import redis

# redis = redis.Redis(host='127.0.0.1', port=6379)

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)

redis = redis.Redis(connection_pool=pool)

print(redis.hgetall("shopping_car_1_1"))

效果:

{b'name': b'python\xe5\x85\xa8\xe6\xa0\x88', b'default_price_policy_id': b'', 
b'course_img': b'python.png',
b'relate_price_policy': b'{"1": {"prcie": 100.0, "valid_period": 7, "valid_period_text": "1\\u5468"},
"2": {"prcie": 200.0, "valid_period": 14, "valid_period_text": "2\\u5468"},
"3": {"prcie": 300.0, "valid_period": 180, "valid_period_text": "6\\u4e2a\\u6708"}}'}

效果图-作出黑框里这些内容

AI学习吧-购物车-添加商品接口的更多相关文章

  1. Swing学习2——图标添加Icon接口使用

    废话没有,看代码. 主要就是通过实现Icon接口在标签添加一个圆形图标,并在框架中显示. package com.sword.swing_test; import javax.swing.*; imp ...

  2. Flutter实战视频-移动电商-51.购物车_Provide中添加商品

    51.购物车_Provide中添加商品 新加provide的cart.dart页面 引入三个文件.开始写provide类.provide需要用with 进行混入 从prefs里面获取到数据,判断有没有 ...

  3. 添加商品到购物车add_to_cart.php(学生笔记)

    <?php session_start();//启动session $goods_id = $_POST['goods_id'];//获取商品id $number = $_POST['num'] ...

  4. AI学习吧

    一:AI学习吧 项目描述 系统使用前后端分离的模式,前端使用vue框架,后端使用restframework实现. 项目需求 公司开发AI学习吧,由于公司需要一款线上学习平台,要开发具有线上视频学习.支 ...

  5. Python学习--------------Atm+购物车系统

    一.程序需求 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号 ...

  6. JAVAEE——宜立方商城09:Activemq整合spring的应用场景、添加商品同步索引库、商品详情页面动态展示与使用缓存

    1. 学习计划 1.Activemq整合spring的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. 使用方法 ...

  7. 淘淘商城项目_同步索引库问题分析 + ActiveMQ介绍/安装/使用 + ActiveMQ整合spring + 使用ActiveMQ实现添加商品后同步索引库_匠心笔记

    文章目录 1.同步索引库问题分析 2.ActiveM的介绍 2.1.什么是ActiveMQ 2.2.ActiveMQ的消息形式 3.ActiveMQ的安装 3.1.安装环境 3.2.安装步骤 4.Ac ...

  8. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)

    一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...

  9. AI 学习路线

    [导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...

随机推荐

  1. python的扩展包requests的高级用法

    Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最 ...

  2. TextView 文字拼接

    //引用文字 String testStr = (getResources().getString(R.string.test_str,"<font color='#ff0000'&g ...

  3. linux 服务器下的基本操作

    1.SSH 上传: scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载: scp user(远端用户 ...

  4. [Docker]如何批量删除镜像

    docker 使用一段时间之后,可能堆积很多用不着的,或者编译错误的镜像,一个一个删除就很麻烦,需要一个批量删除的方法,如下: docker rmi $(docker images | grep &q ...

  5. CVE-2019-0797漏洞:Windows操作系统中的新零日在攻击中被利用

    https://securelist.com/cve-2019-0797-zero-day-vulnerability/89885/ 前言 在2019年2月,卡巴实验室的自动漏洞防护(AEP)系统检测 ...

  6. python3+selenium框架设计02-自动化测试框架需要什么

    什么是自动化测试框架 自动化测试框架能够提供便利给用户高效完成一些事情,比如,结构清晰开发脚本,多种方式.平台执行脚本,良好的日志和报告去跟踪脚本执行结果. 关于自动化测试框架的定义有很多,在我大致理 ...

  7. WebSocket参考

    websocker是一种网页和服务端建立tcp全双工通信的技术,可以不再让页面进行向服务器发送轮询请求. 需要注意使用的场景,如果建立的tcp过多的话,会对服务器有很大压力. WebSocket前后台 ...

  8. datepicker 属性设置 以及方法和事件

    DatePicker支持鼠标点选日期,同时还可以通过键盘控制选择: page up/down - 上一月.下一月 ctrl+page up/down - 上一年.下一年 ctrl+home - 当前月 ...

  9. (一)七种AOP实现方法

    在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...

  10. 谓词逻辑 p->q 的真假

    若p为假,则q可取真或假,p->q为永真 若p为真,q为假,则p->q为假 若p为真,q为真,则p->q为真 p q p->q 0 0 1 0 1 1 1 0 0 1 1 1 ...