luffy
restful 规范
用户发来请求:
url(https:使用https代替http
api标识
版本 (API的版本号放入这里边)
名词 所有网址中不能有动词,只能有名词
条件 k1=v1&k2=v2的形式
)
method 请求方式:get,delete,post,put
返回状态码
返回结果
get ---->查看数据------>返回所有数据列表:[{},{},{}]
post---->添加数据------>返回添加数据:{}
put------>更新pk=1的数据------>返回更新后的数据:{}
delete------>删除pk=1的数据------->返回空
get ------->查看单条数据-------->返回查看的单条数据{}
错误信息
{
“error”:1,
"msg":"系统操作异常"
}
hyper link 发送给前端
[
{'name':'大表哥','depart_id':http://luffycity.com/api/v1/depart/1/ },
{'name':'小老弟','depart_id':http://luffycity.com/api/v1/depart/2/ },
]
django rest framework框架
帮助开发者快速搭建遵循restful api规范的接口。
内部提供了一些方便的组件: 路由 视图(*) ***** - 简单的数据增删改查操作:ModelViewSet - 复杂业务&redis: APIView 版本处理 认证 权限 限流(访问频率限制) 解析器,将请求体中的数据转换成指定类型。 分页处理 序列化,对数据库中获取的QuerySet进行序列化操作 ***** 渲染器
为什么存在跨域?
浏览器存在同源策略。
如何解决跨域?
- CORS - 简单请求 - 复杂请求 - JSONP(只能发送GET;返回数据格式: 函数名({'k1':123,'k2':456})) 注意:线上不存在跨域 https://www.luffycity.com/course https://www.luffycity.com/api/v1/courses/
项目总结
购物车是如何如何实现的?
1:当用户选择需要购买的课程和价格策略后,有两种方式购买课程:
一:直接购买,将课程id和选择的价格策略放到redis中,
跳到去支付页面,从redis中获取购买课程的id和价格策略id,
如果该用户要使用优惠券和贝利,则选择当前用户所拥有并且未使用和没过期的优惠券,
得到折后价格,点击去支付完成支付,删除购物车信息,生成订单,保存到数据库。
二:添加到购物车中完成支付(post)
获取到所选课程的id和价格策略id传到后端,
在后端获取,根据课程id获取到当前课程,根据当前前课程所有的价格策略,
判断在后端获取到的价格策略id在不在当前课程的价格策略中,
不在的话则抛出异常价格策略不存在,在的话继续执行。
将该课程所有价格策略的id,时间周期和价格存放到列表中(price_policy_list)中。
继续将该课程的:课程id,课程图片地址,课程标题,
所有价格策略,默认价格策略封装在字典(course_dict)中。
判断当前用户的购物车中是否有东西,没有的话则把当前课程放入到购物车中,
如果购物车中已经有课程课程,则将该课程添加到购物车中,最后封装好放到redis中。
去结算:
获取用户提交的课程id, 判断是否选择要结算的课程,没选择则抛出异常。
检测购物车中是否已经有课程(应该有课程的)。
检测购物车中是否有用户要购买的课程
如果所结算的课程在购物车中,
获取选中价格策略的价格详细,
选择购物车中当前课程下的所有价格策略以及相等的价格策略,获取其信息,
获取当前用户所有的优惠券,
区分用户的优惠券种类,课程优惠券添加到课程中;全局优惠券添加到全局,
循环遍历当前用户的所有优惠券,判断他们是否过期,
如果没过期,判断他们是全局优惠券还是针对某个课程的优惠券,
区分好是什么优惠券,后面区分该优惠券是什么类型,
是通用券,还是满减券,折扣券,全局优惠券,
针对不同的优惠卷,最后将所有数据封装放到redis上。
去支付: 1.去结算中心获取要结算的所有课程和优惠券, 2.循环遍历每一个课程, 开始总价格和折扣价都为0, 如果该课程没有使用优惠券,则支付价格=课程原价,折扣价=0, 3.如果使用了优惠券,则需要去判断所使用的优惠券是否已经过期, 或是否已经被使用,如果过期了或者被使用了就抛出异常, 否则继续往下执行,判断该优惠券的类型. 3.判断优惠卷类型计算出相应的折扣。支付总价=商品总价 - 折扣 4.获取当前用户的贝里,获取总价。判断贝里是否能全额支付。 6.点击立即支付以后, 进行数据库操作,生成订单。 生成订单: 点击立即支付,生成订单,订单根据前面支付是否等于0来判断支付状态:已支付或者待支付; 生成订单详情,循环课程信息,写入课程的原价,折后价,支付价,视频的有效期即订单的有效期, 对优惠券进行处理,把该用户已使用的优惠券状态改为已使用; 修改贝里,该账户的贝里减去使用的贝里,并更新贝里消费记录表, 显示账户的消费金额,账户的余额等。 最后删除购物车中的信息,即redis中的购物车信息。
自定义rest认证token 认证是如何实现的?
自定义token认证。客户端传递过来的token等参数进行身份验证。
通过rest framework为我们提供的认证机制去验证,每一类继承BaseAuthention,里面实现了一个authtent方法,
获取用户传过来的token,看传过来的token是否和数据库的一致,一致验证通过,不一致,说明是无效token.
API接口的速率限制是如何实现的?
针对匿名用户和登录用户加以区分,登录用户记录它的name,匿名用户记录它的IP。
我们项目中又判断了一下是否是管理员,根据用户类型的不同,来判定不同的限流策略。
创建一个类继承BaseThrethe,写一个allow_request和wuit方法限制访问。