s11 day100路飞项目逻辑购物车一
Luffy项目
先看练习,如下:
一. 添加购物车和查看
1. url
url(r'^shoppingcar/$', shoppingcar.ShoppingCarView.as_view({"post":"create","get":"list"})),
2. 视图
class ShoppingCarView(ViewSetMixin,APIView):
def list(self,request,*args,**kwargs):
return Response("h")
def create(self, request, *args, **kwargs):
print("request.body===>",request.body)
print("request.post===>",request.POST)
return Response({"code": })
① 通过postman发送 JSON格式请求(application/json)request.body

输出结果:

POST里面没有值


② request.data
print("request.body===>",request.body)
print("request.data===>",request.data)
print("request.post===>",request.POST)
打印结果:
request.body===> b'{\t\n\t"courseid":1,"policyid":2\n\t\n}'
request.data===> {'courseid': , 'policyid': }
request.post===> <QueryDict: {}>
以上是application/json格式发送请求
下面为 urlencoded格式
print("request.body===>",request.body)
print("request.data===>",request.data)
print("request.post===>",request.POST)
发送请求:

输出结果:
request.body===> b'k1=123&k2=456'
request.data===> <QueryDict: {'k1': [''], 'k2': ['']}>
request.post===> <QueryDict: {'k1': [''], 'k2': ['']}>
这些request 不是Django的request , 而是 restframework的request.
request._request为 Django的request
print("request.body===>",request.body)
print("request.data===>",request.data)
print("request.post===>",request.POST)
print("***"*)
print("django's request",request._request.body)
print("django's request",request._request.POST)
发送urlencode数据格式
request.body===> b'k1=123&k2=456'
request.data===> <QueryDict: {'k1': [''], 'k2': ['']}> restframework的request
request.post===> <QueryDict: {'k1': [''], 'k2': ['']}>
******************************
django's request b'k1=&k2='
django's request <QueryDict: {'k1': [''], 'k2': ['']}>
发送Application/json数据格式
request.body===> b'{\t\n\t"courseid":1,"policyid":2\n\t\n}'
request.data===> {'courseid': , 'policyid': }
request.post===> <QueryDict: {}>
******************************
django's request b'{\t\n\t"courseid":,"policyid":\n\t\n}'
django's request <QueryDict: {}>
一、路飞项目的逻辑:
1. 接收用户选中的课程id和价格策略
course_id = request.data.get("courseid")
policy_id = request.data.get("policyid")
2. 判断数据的合法性
a.课程是否合法
b.价格策略是否合法
def create(self, request, *args, **kwargs):
# . 接收用户选中的课程ID和价格策略ID
course_id = request.data.get("courseid")
policy_id = request.data.get("policyid")
# .判断数据是否合法
# -课程是否合法
# - 价格策略是否合法
#2.1 课程是否合法
course= models.Course.objects.filter(id =course_id).first()
print(course)
if not course:
return Response({"code":,"error":"课程不存在"})
price_policy_query_set =course.price_policy.all()
price_policy_dict={}
for item in price_policy_query_set:
temp ={
"id" :item.id,
"price" :item.price,
"valid_period" :item.valid_period,
"valid_period_display":item.get_valid_period_display()
}
price_policy_dict[item.id]=temp
#2.2 价格策略是否合法
if policy_id not in price_policy_dict:
return Response({"code":,"error":"价格策略你别瞎改"})
return Response({"code": })
构建数据类型
1. 列表
2. 字典 (以id作为key,)
price_policy_query_set =course.price_policy.all()
price_policy_list =[]
price_policy_dict={} for item in price_policy_query_set: temp ={
"id" :item.id,
"price" :item.price,
"valid_period" :item.valid_period,
"valid_period_display":item.get_valid_period_display()
}
price_policy_list.append(temp)
price_policy_dict[item.id] =temp
print(price_policy_list)
print("**"*)
print(price_policy_dict)
print(("**"*))
print(item.id ,item.price,item.valid_period,item.get_valid_period_display)
结果:
[{'id': , 'price': 100.0, 'valid_period': , 'valid_period_display': '1周'}]
****************************************
{: {'id': , 'price': 100.0, 'valid_period': , 'valid_period_display': '1周'}}
****************************************
100.0 <bound method curry.<locals>._curried of <PricePolicy: MySQL入门(付费)(1周)100.0>>
[{'id': , 'price': 100.0, 'valid_period': , 'valid_period_display': '1周'}, {'id': , 'price': 20000000.0, 'valid_period': , 'valid_period_display': '2个月'}]
****************************************
{: {'id': , 'price': 100.0, 'valid_period': , 'valid_period_display': '1周'}, : {'id': , 'price': 20000000.0, 'valid_period': , 'valid_period_display': '2个月'}}
****************************************
20000000.0 <bound method curry.<locals>._curried of <PricePolicy: MySQL入门(付费)(2个月)20000000.0>>
[/Aug/ ::] "POST /api/v1/shoppingcar/ HTTP/1.1"

赋值测试:

三、把商品和价格放入购物车:
1. 添加到购物车 create
#.把商品和价格侧率信息放入购物车shoppingcar """ 购物车中要放: 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 redis不支持字典套字典需要dumps出来 { :{ 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 } :{ 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 } } { shopping_car_用户ID_课程ID:{ id:课程ID name:课程名称 img: 课程图片 default:... price_list:所有价格策略 } } """ key ="shopping_car_%s_%s"%(,course_id)
# 1 可以定义为变量 USER_ID =1 CONN.hset(key,"id",course_id) CONN.hset(key,"name",course.name) CONN.hset(key,"name",course.course_img) CONN.hset(key,"deault_price",policy_id) CONN.hset(key,"price_policy_dict",json.dumps(price_policy_dict)) return Response({"已经成功加入购物车"})
#.把商品和价格侧率信息放入购物车shoppingcar """ 购物车中要放: 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 redis不支持字典套字典需要dumps出来 { 1:{ 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 } 2:{ 课程ID 课程名称 课程图片 默认选中的价格侧率 所有价格策略 } } { shopping_car_用户ID_课程ID:{ id:课程ID name:课程名称 img: 课程图片 default:... price_list:所有价格策略 } } """ key ="shopping_car_%s_%s"%(,course_id)
# 可以定义为变量 USER_ID = CONN.hset(key,"id",course_id) CONN.hset(key,"name",course.name) CONN.hset(key,"name",course.course_img) CONN.hset(key,"deault_price",policy_id) CONN.hset(key,"price_policy_dict",json.dumps(price_policy_dict)) return Response({"已经成功加入购物车"})
测试redis
postman发一个请求

另起一个文件
import json
import redis
conn =redis.Redis(host="127.0.0.1",port="")
print(conn.keys()) print(conn.hget('shopping_car_1_1',"id").decode("utf-8"))
print(conn.hget('shopping_car_1_1',"name").decode("utf-8"))
# print(conn.hget('shopping_car_1_1',"img").decode("utf-8"))
# print(conn.hget('shopping_car_1_1',"default_price_id").decode("utf-8"))
print(json.loads(conn.hget('shopping_car_1_1',"price_policy_dict").decode("utf-8")))
打印结果:
[b'shopping_car_1_1']
{'': {'id': , 'price': 100.0, 'valid_period': , 'valid_period_display': '1周'}, '': {'id': , 'price': 20000000.0, 'valid_period': , 'valid_period_display': '2个月'}}
2. 查看购物车 list
def list(self,request,*args,**kwargs):
ret ={"code":,"data":None,"error":None}
try:
shopping_car_course_list =[] pattern ="shopping_car_%s"%(USER_ID,)
user_key_list =CONN.keys(pattern)
for key in user_key_list:
temp ={
"id":CONN.hget(key,"id").decode("utf-8"),
"name":CONN.hget(key,"name").decode("utf-8"),
"img":CONN.hget(key,"img").decode("utf-8"),
"default_price_id":CONN.hget(key,"default_price_id").decode("utf-8"),
"price_policy_dict":json.load(CONN.hget(key,"price_policy_dict").decode("utf-8"))
}
shopping_car_course_list.append(temp) ret["data"]= shopping_car_course_list
except Exception as e:
ret["code"]=
ret["error"]="获取购物车数据失败"
return Response(ret)
3. 购物车删除
url(r'^shoppingcar/$',shoppingcar.ShoppingCarView.as_view({"post":"create","get":"list","delete":"destroy"})),
def destory(self,request,pk,*args,**kwargs):
respone= BaseResponse()
try:
courseid = request.GET.get("couseid")
key ="shopping_car_%s_%s*"%(USER_ID,courseid)
CONN.delete(key)
respone.data ="删除成功"
except Exception as e:
respone.code =
respone.error ="删除失败"
return Response("删除成功")
===================购物车逻辑=========================
s11 day100路飞项目逻辑购物车一的更多相关文章
- s11 day 101 python Linux环境安装 与路飞项目支付功能
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = ...
- 路飞项目背景,contentType以及django缓存
昨日回顾: 分页器: 普通分页 # 普通分页 from rest_framework.pagination import PageNumberPagination -每页的大小(默认) -查询的时候, ...
- vue第十七单元(电商项目逻辑处理,电商划分)
第十七单元(电商项目逻辑处理,电商划分) #课程目标 1.什么是电商项目 2.什么是B2B,B2C,C2C模式,常见的电商项目 3.移动端电商项目常见的逻辑处理 4.[知识扩展]传统系统架构及分布式系 ...
- git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...
- DRF 商城项目 - 购物( 购物车, 订单, 支付 )逻辑梳理
购物车 购物车模型 购物车中的数据不应该重复. 即对相同商品的增加应该是对购买数量的处理而不是增加一条记录 因此对此进行联合唯一索引, 但是也因此存在一些问题 class ShoppingCart(m ...
- s11 day 102 python Linux环境安装 与路飞项目 微信平台接口
1.微信公众号平台沙箱环境地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 二.结算中心业务 结算中心: -购物车,删 ...
- Android 开发笔记___实战项目:购物车
购物车的应用很广泛,电商app基本上都有它的身影.由于它用到了多种存储方式,通过项目对数据的存储有更高层次的了解. 1.设计思路 首先看看购物车的外观.第一次进入时里面是空的,去购物页面加入购物车以后 ...
- django项目中购物车的实现
对于做项目而言,最重要的是分析清楚自己负责模块的思路,确定思路后,把每一步实现的步骤确定后,根据步骤,去实现代码,测试. 购物车的逻辑: 登录用户可以添加购物车,未登陆用户页可以添加到购物车 ...
- 阶段性项目 ATM+购物车项目
ATM + 购物车https://www.cnblogs.com/kermitjam/articles/10687180.html readme 内容前戏: 一个项目是如何从无到有的. 一 需求分析 ...
随机推荐
- Python学习记录day7
目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...
- MongoDB使用场景和局限 (转)
MongoDB的使用场景: 1.Web应用程序.文档能表示丰富的数据结构,建模相同数据库所需的集合数量通常会比使用完全正规化关系型数据库的数据表数量要少.动态查询和二级索引能让你轻松的实现SQL开发者 ...
- linux 下的 rsync 文件同步
rsync是linux下的一款快速增量备份工具Remote Sync,是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync ...
- MySql的数据分页的Sql
一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的 ...
- Js下载文件到本地(兼容多浏览器)
在客户端通过js下载文件,试过几种下载方式,iframe方式仅限于IE浏览器,window.open(url),location.href=url 这两种方式在chrome浏览器还会是直接打开文件而不 ...
- 品味性能之道<六>:图形化SQL分析工具
在上一章里,重点分享了命令行SQL分析工具的使用方法.在本章将重点分享PL/SQL的SQL分析工具. 一.如何打开PL/SQL执行计划 开启PL/SQL这工具,推荐如下方法: 点击 ...
- 一名优秀的UI设计师应该具备哪些条件?
想做好一个好的UI设计师除了应该具有一定的审美能力,还要了解整个产品的开发过程,因为目前国内的软件行业还不能对UI设计形成应有的重视度,所以对我们的要求就更高了,你要能作出夺人眼球的东西,还要站在用户 ...
- swift 添加webview
swift显示HTML代码 在布局中的方法 1.根据URL 直接显示内容, var urls : NSURL = NSURL(string: "http://www.baidu.com&q ...
- eclipse缓存太重,新手最容易中招
有4种方法,从上到下清理:
- Sublime必用快捷键[私人]
最近一年前端开发都是用sublime这款编辑器, 相对于webStorm强大而启动慢.editplus快启动而功能弱, sublime恰好在两者之间:而且其指令行安装.更新.卸载插件比eclipse之 ...