• DRF简介/接口概念


    一、drf框架简介

    1. drf安装

    1、drf是django框架的一个插件,所以要先安装django;

    2、安装命令:pip3 install djangorestframework

    3、使用drf时,要在settings中注册

    2. drf的优势

    可以在前后端分离的开发中提高开发Rest API接口的效率。

    二、接口

    1. 接口的概念

    什么是接口:规定了提交请求方式的url链接,访问它可以获取响应的反馈数据。也就是前后台信息交互的媒介。

    接口的组成:url链接+请求方式+请求参数+响应数据

    2. 接口文档

    一个合格的接口应该有一份与之对应的文档,该文档可以帮助使用接口的用户更好更快的了解这个接口,从而进行开发。

    文档的编写很简单,只需将接口的四个组成部分翻译成文档形式即可。

    包括但不限于接口路径、请求方式、请求参数和响应数据的格式。

    3. 接口规范(restful)

    3.1 url链接规范

    1. 接口都是操作前后台数据的,所以需要保证数据的安全性,因此:

      • 采用https协议
    2. 接口用来操作数据,与网址(操作页面)有区别,所以用特定的关键字表示接口:

      • api关键字
      - https://api.baidu.com
      - https://www.baidu.com/api
      
    3. 接口操作的数据称之为资源,在url中只体现资源名称(名词),不体现操作资源的方式动词(即不用get_book这种命名方式)

      • 常规资源接口(只用名词)
      - https://api.baidu.com/books/
      - https://api.baidu.com/books/(pk)/
      
      • 非常规接口 - 和某资源不是特别密切或是不止一种资源(可用动词)
      - https://api.baidu.com/login/
      - https://api.baidu.com/place/search/	
      
    4. 如果一个资源存在多版本结果,在url链接中要用特定符号来兼容多版本共存

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

      • ?+限制条件
      https://api.baidu.com/v1/books/?ordering=-price&limit=3
      

    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.3 响应结果规范

    1. 网络状态码(网络状态信息和网络状态码捆绑出现,不要额外设置):

      • 1xx:基本信息
      • 2xx:成功
        • 200基本
        • 201新增成功
      • 3xx:重定向
      • 4xx:客户端错误
        • 400错误请求
        • 403请求无权限
        • 404请求资源不存在
      • 5xx:服务端错误
        • 500服务器错误
    2. 数据状态码(一般都是前后台约定规则):

      • 0:成功
      • 1:失败 - 1xx:具体失败信息(要在接口文档中明确写出)
      • 2:无数据 - 2xx:具体无数据信息(要在接口文档中明确写出)
    3. 数据状态信息(一般不仅仅是对数据状态码的解释,更多是对结果的描述,给前台开发者阅读的):

    4. 数据结果(常量、数组、字典),如果有子资源(图片、音频、视频),返回资源的链接:

      {
          "status": 0,
          "msg": 'ok',
          "results": [{
              "name": "西游记",
              "img": "https://api.baidu.com/media/book/abc.png"
          }]
      }
      

    4. 规范接口的写法

    一个资源一个对应十个接口

    # urls.py
    from django.conf.urls import url
    
    from . import views
    urlpatterns = [
        # http://127.0.0.1:8000/api/books/
        # http://127.0.0.1:8000/api/books/(pk)/
        url(r'^books/$', views.BookView.as_view()),
        url(r'^books/(?P<pk>d+)/$', views.BookView.as_view())
    ]
    
    # views.py
    from django.http import JsonResponse
    from django.views import View
    from . import models
    # 一个视图类可以保护常规五个请求方法:get|post|put|patch|delete
    # 五个请求方法处理十个资源操作的逻辑:单群查|单群增|单群整体改|单群局部改|单群删
    
    class BookView(View):
    
        def _single_get(self, pk):
            book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
            if not book_dic:
                return JsonResponse({
                    'status': 1,
                    'msg': '单查 资源不存在',
                })
            return JsonResponse({
                'status': 0,
                'msg': '单查 ok',
                'results': book_dic
            })
        def _many_get(self):
            book_query = models.Book.objects.values('name', 'price')
            book_list = list(book_query)
            return JsonResponse({
                'status': 0,
                'msg': '群查 ok',
                'results': book_list
            })
    
        def get(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            if pk:  # 单查
                return self._single_get(pk)
            else:  # 群查
                return self._many_get()
    
        def post(self, request, *args, **kwargs):
            return JsonResponse({
                'status': 0,
                'msg': 'post ok'
            })
    
        def put(self, request, *args, **kwargs):
            return JsonResponse({
                'status': 0,
                'msg': 'put ok'
            })
    
        def patch(self, request, *args, **kwargs):
            return JsonResponse({
                'status': 0,
                'msg': 'patch ok'
            })
    
        def delete(self, request, *args, **kwargs):
            return JsonResponse({
                'status': 0,
                'msg': 'delete ok'
            })
    
    
  • 相关阅读:
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    Java基础篇之Java特性
    软件工程(2019)结对编程第二次作业
    软件工程(2019)结对编程第一次作业
    软件工程(2019)第三次作业
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    结对编程作业 2
    结对编程作业 1
  • 原文地址:https://www.cnblogs.com/bowendown/p/12087987.html
Copyright © 2020-2023  润新知