当前位置: 首页 > 工具软件 > ApiView > 使用案例 >

DRF框架及APIView

孟绪
2023-12-01

1.前后端不分离

缺点

  • 业务耦合较强
  • 指责划分不明确
  • 开发成本较高
  • 服务器压力较大
    在服务端渲染页面返回给用户,在高并发情况下会占用大量资源

优点

  • 提高SEO速度,提高搜索引擎收录检索速度
    页面数据都是渲染好返回的

2.前后端分离

概念
  • 前:浏览器

    • HTML、CSS、Bootstrap、JS、JQuery、Vue、NodeJS、webpack
    • 体验为主:炫酷、流畅、兼容
  • 后:服务器

    • Jvm、springboot、Django、flask、tornado
    • 三高:高并发、高可用、高性能

前后端分离:后台常返回的数据为JSON数据,这个过程为–‘序列化’

优点

  • 部署解耦
  • 业务划分清晰,职责更为明确
  • 开发成本较低,一套后台可以支持多套前端渲染

缺点

  • SEO优化较差,需要引入一些页面静态化手段

3.什么是restful风格

概念:前端需要增删改查,相应的每个操作后端都需要提供一个接口

RestFul 规范建议

1) 域名要有标志

Api服务器的域名要尽量在专用域名之下

2)路由中体现接口版本号

建议把接口版本号维护在URL

3)使用合理的请求方式
  • GET:获取数据
  • POST:提交、创建数据
  • PUT:提交、更新数据
  • DELETE:删除数据

不常用的HTTP动词

  • PATCH:在服务器更新资源
  • HEAD:获取资源元数据
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的
4)提供参数过滤数据

可以让API提供参数,进行结果返回
例:(视情况而定)

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
5)使用合理的状态码

接口返回数据,还要带上合理状态码
2开头状态码

200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。

4开头状态码

400 INVALID REQUEST - [POST/PUT/PATCH] # 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*] # 表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] # 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。
404 NOT FOUND - [*] # 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET] # 用户请求的格式不可得(比如用户请求 JSON 格式,但是只有 XML 格式)。
410 Gone -[GET] # 用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] # 当创建一个对象时,发生一个验证错误。

5开头状态码

500 INTERNAL SERVER ERROR - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功

4.接口及接口档案

API,即应用程序编程接口,接口决定了功能
API在内部预定以了函数,能够使开发人员无须明白API内部实现的机制,就能够实现某个功能


为什么要写接口文档?

  • 开发过程中,工程师有个文件进行沟通交流开发
  • 后期方便查看、维护

如何阅读接口文档

API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例几个部分:

  • 接口描述:简单描述接口的逻辑和作用

  • 接口地址:网络地址

  • 请求方法

  • 请求参数:用来传递信息的变量。即需要请求的字段名的名称和规则:都是哪些字段,字段的类型是什么,是否必填字段等等;

    • URL传参
    • Headers 请求头
    • Body 请求内容
  • 相应内容:接口返回字段名称和规则

  • 错误代码:对接口的错误用代码进行归类,以便能快速找到错误原因,解决问题;

  • 实例:实际调用时响应的内容

5.DRF工程

前后端分离需要使用的框架

安装框架

pip install djangorestframework

:配置setting

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework', # drf框架
    'myapp', # 注册子应用

]

1) drf官方文档导读

封装了很多功能

  • 将请求的数据转换成模型类对象
  • 操作数据库
  • 将模型类对象转换为响应的数据,json格式

  • 视图封装:DRF统一封装了请求的数据为request.data以及返回数据的Response方法
  • 序列化器:DRF提供了序列化器,可以进行序列化反序列化
  • 认证:对用户登陆进行身份验证
  • 权限:对用户权限进行认证,超级用户、普通用户、匿名用户啥的
  • 限流:对访问的用户流量进行限制减轻接口的访问压力
  • 过滤:可以对列表数据进行字段过滤,并可以通过添加django-fitlter扩展来增强支持
  • 排序:来帮助我们快速指明数据按照指定字段进行**排序
  • 分页:可以对数据集进行分页处理
  • 异常处理:DRF提供了异常处理,我们可以自定义异常处理函数
  • 接口文档生成:DRF还可以自动生成接口文档

6.APIView

1)APIView处理Request

.data
解析POST、PUT、PATCH请求方式解析后的数据


.query_params
解析GET请求方式的数据

2)视图的Response及json处理

将已经序列化好的数据结合Response返回

Response(返回数据,status=状态码,template_name=None,headers=None,exception=False, content_type=None)
# 返回数据:提取出来成为Python的数据类型或者使用序列化方式处理
# headers:头部信息
# content-type:返回数据MIME类型,drf会自动根据数据进行设置
3)常见状态码及Response的状态码处理
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。

7.序列化(重点)

1) 什么是序列化

序列化:把ORM模型层数据返回为JSON数据集
反序列化:把前端发来的JSON数据,变为模型层数据

2)DRF序列化器

在子应用中创建serializers.py文件

# 序列化器
from rest_framework import serializers

class PeopleSerializer(serializers.Serializer):
    # 与模型一一对应
    name = serializers.CharField(max_length=20)
    sex = serializers.CharField(max_length=20)
    money = serializers.IntegerField()
    ranking = serializers.IntegerField()

将数据转换

导包
from myapp.serializers import PeopleSerializer

class PeopleView(APIView):
	    def get(self,request):
        people = People.objects.all()
        # people是要序列化的数据  many=True 多个数据
        ser = PeopleSerializer(people,many=True)
        # 注意:返回的是 .data
        return Response(ser.data,status=200)

8.APIView实例

建一个新的项目,配置信息(此处省略,请看之前的博客)
记得在setting中配置drf框架

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework', # drf框架
    'myapp', # 注册子应用

]
1)创建模型
from django.db import models

# Create your models here.

class People(models.Model):
    name = models.CharField(max_length=20,verbose_name='姓名')
    sex = models.CharField(max_length=20,verbose_name='性别')
    money = models.IntegerField(verbose_name='身价')
    ranking = models.IntegerField(verbose_name='排名')

    class Meta:
        db_table='people'
        verbose_name = '名人表'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.name

2)序列化器

在子应用中创建serializer.py文件

# 序列化器
from rest_framework import serializers

class PeopleSerializer(serializers.Serializer):
    # 与模型一一对应
    name = serializers.CharField(max_length=20)
    sex = serializers.CharField(max_length=20)
    money = serializers.IntegerField()
    ranking = serializers.IntegerField()
3)视图
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import People
from myapp.serializers import PeopleSerializer

# Create your views here.
class MyView(APIView):
    def get(self,request):
        print(request.query_params)
        return Response({'msg':'success'},status=200)

    def post(self,request):
        print(request.data)
        return Response({'msg':'success'},status=201)


class PeopleView(APIView):
    # 查询信息
    # def get(self,request):
    #     people = People.objects.all()
    #     list1 = [] # 手动序列化过程
    #     for i in people:
    #         people_dict = {
    #             'name':i.name,
    #             'sex':i.sex,
    #             'money':i.money,
    #             'ranking':i.ranking,
    #         }
    #         list1.append(people_dict)
    #     return Response(list1,status=200)

    def get(self,request):
        people = People.objects.all()
        # people是要序列化的数据  many=True 多个数据
        ser = PeopleSerializer(people,many=True)
        # 注意:返回的是 .data
        return Response(ser.data,status=200)

4) 路由

我采用了路由分发

from django.urls import path
from myapp import views
urlpatterns = [
    path('myview/',views.MyView.as_view()),
    path('people/',views.PeopleView.as_view()),
]
 类似资料: