DRF框架基础

DRF框架基础

1、接口

1、什么是接口

接口:前台与后台进行信息交互的媒介 - url链接

2、接口组成

url链接:长得像返回数据的url链接

请求方式:get(查)、post(增)、put(整体改)、patch(局部改)、delete(删)

请求参数:拼接参数、数据包参数(urlencolded、form-data、json)

响应结果:响应json数据

3、开发阶段接口测试工具

1、安装postman,同时支持各种操作系统,测试接口用的

Postman直接下载安装即可

2、使用:

创建简单get请求测试

简单post请求

请求百度地图接口案例

4、接口文档

1、为什么要写接口文档

首先要知道我们为什么要写接口:作为后台开发者,要将后台数据通过url链接反馈给前台

为什么要写文档:因为涉及到前台与后台的交互,要知道该url 链接时说明请求方式、提交哪些数据、返回哪些结果

接口文档就是给后台开发、前台开发、测试等各项目相关项目组同时查看的,方便团队开发(规则是后台来制定的,文档也是后台来写的)

2、采用什么编写文档

  1. 采用word编写

  2. drf框架插件,可以根据CBV的类快速生成文档,但是规定类要完全符合规范

  3. 一般大多都采用写文档的平台,比如YAPI、或者自己达服务器编写文档平台

3、书写过程

1、先按照开发需要,完成接口的开发(设置后台url请求方式、请求数据、响应结果)

2、选择一个接口平台,将后台的url链接,请求方式,请求数据,响应结果等信息转换成文档即可(此处我们用YAPI示例)

  1. 进入平台后

  1. 新建项目

  1. 创建接口

  1. 编写接口

 

 

2、接口规范

1、为什么要指定接口规范

前后台分离的情况下,后台可以采用不同的后台运用,开发出类似的功能,所以前后台请求响应的规则是一致的,如果按照一套标准来编写接口,后台不管是什么语言,前台不管是什么请求(页面、工具、代码)前后台都你进行交互

2、通用的接口规范:restful接口规范

规定了url如何编写,请求方式的含义,响应的数据规则

1、url编写

  1. HTTPS协议:内部采用了加密和解密保证了数据的安全性

  2. api字眼:标识操作的是数据,https://www.baidu.con/api

  3. v1/v2字眼:数据点不同版本共存,https://api.baidu.com/v2

  4. 资源复数:交互的数据我们称为资源,https://api.baidu.com/books,一般不要出现动词,除非特例比如search、login

  5. 拼接条件:过滤群查接口数据(https://api.baidu.com/books/?limit=3&ordering=-price

2、请求方式

    /books/ - get - 群查
    /books/(pk)/ - get - 单查
    /books/ - post - 单增
    /books/(pk)/ - put - 单整体改
    /books/(pk)/ - patch - 单局部改
    /books/(pk)/ - delete - 单删

3、响应结果

网络状态码与状态信息:2xx | 3xx | 4xx | 5xx

数据状态码:前后台约定规则 - 0:成功 1:失败 2:成功没结果

数据状态信息:自定义失败和成功时的的信息接收(英文)

数据本体:json数据

数据资源:头像、视频等用url链接

3、FBV与CBV区别

1、路由绑定

FBV:url(r'^test/$', views.test),

  1. 项目启动,将test函数地址绑定给 /test/ 路由

  2. 请求/test/访问后台,后台就会从view中调用绑定的test函数

CBV:url(r'^test/$', views.Test.as_view()),

  1. 项目启动,将as_view()函数的执行结果返回给view函数地址绑定的/test/路由

  2. 请求/test/访问后台,后台就会调用绑定的view函数

  3. view函数会将请求交个dispatch方法完成分发,分发(反射)给视图类的不同方法处理不同的请求

2、业务处理

FBV:每一个接口都会对应一个函数来响应请求

CBV:可以将一个资源的增删改查所有操作都放在一个类中管理,在内部再分方法逐一处理(高内聚低耦合:六个接口和一个类有关,但都能在类内部处理)

CBV使用:

  1. url中导入views,类后.as_view() , ( url(r'^test/$', views.Test.as_view()),)

  2. 在views中导入View,三种导入方式:

    from django.views import View
    from django.views.generc import View
    from django.views.generc.base import View
  3. 自定义类继承View

    目的:1、继承as_view()方法,完成路由配置,2、继承dispatch()方法,完成请求分发,3、如果自己写了as_view()和dispatch()方法自定义视图类就可以不用继承任何类了

    class Test(View):
        def get(self, request, *args, **kwargs):
            return JsonResponse('cbv ok', safe=False)
    ​
        def post(self, request, *args, **kwargs):
            pass

4、DRF框架安装

1、安装

pip install djangorestframework

2、注册

在settings中APPS注册

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

3、settings中自定义drf配置

drf配置的查找顺序:自定义的settings中的REST_FRAMEWORK配置字典再到drf默认的setts的DEFAULTS

# 自定义drf配置
REST_FRAMEWORK = {
}

4、drf 的封装特点

特点功能在特点的功能模块下面

from rest_framework.views import APIView  # 视图相关
from rest_framework.response import Response  # 响应相关
from rest_framework.request import Request  # 请求相关
from rest_framework.exceptions import APIException  # 异常相关
from rest_framework.filters import SearchFilter  # 搜索过滤相关
from rest_framework.pagination import PageNumberPagination  # 分页相关
from rest_framework.authentication import BaseAuthentication  # 认证
from rest_framework.settings import APISettings  # 配置

5、后台(admin)可视化管理数据

1、在models.py中创建Model类

class Books(models.Model):
    # verbose_name 可视化将name变为'书名'
    name = models.CharField(max_length=32, verbose_name='书名')
    # 数字最长5位,包含小数两位
    price = models.DecimalField(max_digits=5, decimal_places=2)
​
    # 配置类,可视化
    class Meta:
        verbose_name_plural='图书'def __str__(self):
        return self.name

2、在admin.py中注册Model类,方便后台admin可视化管理数据

from django.contrib import admin
from . import models
# admin要控制的model都需要注册一下
admin.site.register(models.Books)

3、执行数据库迁移命令

makemigrations => migrate => 创建管理员createsuperuser => admin | admin123

4、浏览器登录admin录入数据

6、基于restful接口规范接口设计与实现单查群查接口

1、url接口设计

urlpatterns = [
    # 资源books接口的设计
    url(r'^books/$', views.BookAPIView.as_view()),  # 群查、单增
    url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view()),  # 单查、单删、单(整体|局部)改
]

2、实现单查与群查接口

from rest_framework.views import APIView
from rest_framework.response import Response
from . import models
class BookAPIView(APIView):
    def _multiple_get(self):
        # 不能返回,数据是QuerySet[Obj, Obj],也不能强制转换list
        # return list(models.Book.objects.all())

        # QuerySet[dict, dict]
        # print(models.Book.objects.values('name', 'price'))
        # QuerySet[tuple, tuple]
        # print(models.Book.objects.values_list('name', 'price'))

        return Response(list(models.Book.objects.values('name', 'price')))

    def _single_get(self, pk):
        # return Response(models.Book.objects.filter(pk=pk).values('name', 'price').first())

        # 开发阶段建议能用try的地方,不要使用if判断
        try:
            return Response(models.Book.objects.values('name', 'price').get(pk=pk))
        except:
            return Response('资源不存在')


    # 单查、群查
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            # 单查逻辑
            return self._single_get(pk)
        else:
            # 群查逻辑
            return self._multiple_get()

 

posted @ 2020-02-17 23:59  Mr沈  阅读(297)  评论(0编辑  收藏  举报