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方法限制访问。

 

posted @ 2019-04-23 21:16  hnlmy  阅读(480)  评论(0编辑  收藏  举报