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

DRF框架APIView

何章横
2023-12-01

1.前后端分离
前: 主要以页面的美观和流程,兼容三部分
后:主要以三高

业务耦合
需要懂数据库、懂框架操作、懂模版前端

指责划分不明确
会造成团队之间沟通混乱,代码不统一,前后端技能水平层次不齐的水平

成本高
本质上这些软件 APP 用的都是同一套数据,由于不分离的情况,还需要给每一个平台不同的 APP 开发多套后端,这个开发成本很高

服务器压力大
渲染页面本应该是在客户端完成,如今都是在服务端渲染好之后再返回给用户,那么在高并发的情况下,会大量占用服务器的资源

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 - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功
1
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)

采用路由分发

from django.urls import path
from myapp import views
urlpatterns = [
path(‘myview/’,views.MyView.as_view()),
path(‘people/’,views.PeopleView.as_view()),
]

 类似资料: