(day70)DRF安装、接口、CBV源码、DEBUG功能

一、DRF框架安装

  1. DRF是Django插件,所以要提前安装Django
  2. 运行命令pip install djangorstframework
  3. 使用DRF时要在settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
  4. 基于CBV完成满足RSSTful规范的接口

二、接口

(一)什么是接口

  • 接口:规定了提交请求参数请求方式,访问其可以获取响应的反馈数据url链接
  • 四大特点
    1. url链接:长得像返回数据的url链接
    2. 请求方式:get、post、put、patch、delete
    3. 请求参数:json或xml格式的key-valu类型e数据
    4. 响应结果:json或xml格式的数据

(二)接口规范(restful)

(1)url链接

  1. 采用https协议:接口都是操作前后台数据的数据,所以需要保证数据的安全性
  2. API关键字:接口用来操作数据,与网址(操作页面)有区别,所以使用特定的关键字表示
  3. 资源名词:接口操作的数据称之为资源,在url中只体现资源名称,不体现操作资源的方式(https://api.baidu.com/get_books/),而是通过请求方式来确定操作资源方式
    • 常规资源接口
      1. https://api.baidu.com/books/
      2. https://api.baidu.com/books/(pk)/
    • 非常规接口:和某资源不是特别密切或者不止一种资源
      1. https://api.baidu.com/books/login/
      2. https://api.baidu.com/books/place/search/
  4. 多版本共存:如果一个资源存在多版本结果,在url链接中要用特定符号来兼容多版本共存
    • https://api.baidu.com/v1/books/

    • https://api.baidu.com/v2/books/
  5. ?限制条件:群资源操作一般还有额外的限制条件,如排序、限制调试、分页等等

    • https://api.baidu.com/v1/books/?ordering=price&limit=3/

(2)请求方式

  1. get请求:获取单个或多个资源
    • https://api.baidu.com/books/:群查,返回多个结果对象

    • https://api.baidu.com/books/(pk)/:单查,返回一个结果对象
  2. post请求:新增单个或多个资源

    • https://api.baidu.com/books:单增和全增都是该接口,对应返回单个或多个结果对象
  3. put请求:整体修改单个或多个资源
    • https://api.baidu.com/books/:整体修改多个,提供多个数据字典(要包含主键)的数组,完成群改,返回多个结果对象

    • https://api.baidu.com/books/(pk)/:整体修改单个,提供的单个数据字典(主键在url中体现),完成单改,返回单个结果对象
  4. patch请求:局部修改单个或多个资源(常用)
    • 方式与put完全相同
    • 不同点:操作的资源如果有5个key-value键值对,put请求提供的字典必须全包含,但是patch提供字典包含的键值对0~5个都可以
  5. delete请求:删除单个或多个资源
    • https://api.baidu.com/books/:多删,提供多个资源主键数据,没有资源返回(一般会自定义返回结果信息:成功或失败)
    • https://api.baidu.com/books/(pk)/:单删,不需要提供额外数据,没有资源返回(一般会自定义返回结果信息:成功或失败)

(3)响应结果

  1. 网络状态码:响应对象中要包含网络状态码(网络状态信息和网络状态码捆绑出现,不用额外设置)
    • 1xx:基本信息

    • 2xx:成功

      • 200:基本

      • 201:新增成功

    • 3xx:重定向

    • 4xx:客户端错误

      • 400:错误请求
      • 403:请求无权限
      • 404:请求资源不存在
    • 5xx:服务端错误
      • 500:服务器错误
  2. 数据状态码(一般都是前后台约定规则,具体信息要在接口文档中明确写出)
    • 0:成功

    • 1:失败

    • 2:无数据

  3. 数据状态码信息:一般不仅仅是对数据状态码的解释,更多的是对结果的描述,给前后端开发者阅读的

    {
        "status":0,
        'msg':'ok'
    }
  4. 数据结果(常量、数组、字典),如果有子资源(图片、视频、音频),返回资源的url连接

    {
        "status":0,
        "msg":'ok',
        "results":[{
            "name":"西游记",
            "img":"https://api.naidu.com/book/xyj.jpg"
        },{}]
    }

(三)数据接口文档:YApi

  1. YApi是去哪网大前端技术中心的一个开源可视化接口管理平台
  2. 可以搭建在任何本地或云服务器上,完成后台项目开发时的接口编写
  3. YApi的测试网站:http://yapi.demo.qunar.com/

(四)Postman接口测试工具

  1. Postman是一个免费的可视化接口调试工具,同时支持各种操作平台
  2. Postman下载地址:https://www.getpostman.com/downloads/

三、DRF请求生命周期(CBV源码)

  1. 项目一启动就会自动执行as_view方法,返回调用函数view(本质上也是FBV)

  2. 函数view中返回调用对象的dispatch方法

    @classonlymethod
    def as_view(cls, **initkwargs):
        for key in initkwargs:……  # initkwargs没有进行赋值,该逻辑不会执行 
        def view(request, *args, **kwargs):  # 请求来了完成响应的函数
            self = cls(**initkwargs)  # cls是我们自己写的类 MyLogin  self是我们自己定义的类的对象
    
            self.request = request  # wsgi协议包装数据后的request 
            self.args = args  # 无名分组参数
            self.kwargs = kwargs  # 有名分组参数
            return self.dispatch(request, *args, **kwargs)  # view返回什么,用户就能看到什么
    
        # 将请求来调用view的修改信息保存在view对象中
        view.view_class  = cls
        view.view_initkwargs = initkwargs
    
        # 看源码的时候一定要注意在查找属性和方法的时候先从对象自身找,再去类中查找,再去父类查找
        return view  # 返回请求调用的函数地址,进行路由绑定 
  3. dispatch函数中利用反射方法获得请求的方式,从而调用对应方法

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        # 判断当前请求方式在不在默认的八个方法内
        # 1.先以GET请求为例
        if request.method.lower() in self.http_method_names:
            # 利用反射去我们自己定义类的对象中查找get属性或者是方法  getattr(obj,'get')
            # handler = get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 调用get方法

四、DEBUG功能的使用

猜你喜欢

转载自www.cnblogs.com/wick2019/p/12088115.html