DRF上手即用简易教程

DRF框架使用流程

一  API接口

API接口即接口设计规范,主流接口架构:RESTful RPC

二  RESTful架构的接口响应规范

基本接口:

也是设计的目的即数据结构如下图:

  • GET/books  返回资源对象的列表:列表套字典json  [{},{},{}]
  • GET/books/ID   返回单个资源对象:字典json  {}         
  • POST/books     创建并返回新对象:字典json  {}
  • PUT/books/ID   更新并返回对象:字典json  {}
  • DELETE/books/ID  删除并返回空字符串

正常情况下,我们能够在django中用代码自己实现这样的数据结构实现前后台的沟通,但是代码较多,DRF帮助我们简单的实现这个功能,并内部扩展了更多功能.

HTTP动词

常用的HTTP动词有四个(括号里对应的是SQL命令)

  • GET(SELECT) : 从服务器取出资源(一项或多项)
  • POST(CREATE) : 在服务器新建一个资源
  • PUT(UPDATE) : 在服务器更新资源(客户端提供改变后的完整资源)
  • DELETE(DELETE) : 从服务器删除资源

还有三个不常用的HTTP动词:

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

过滤信息(filtering)

如果记录数量很多,服务器不可能一次性将数据返回给用户.API接口提供参数,过滤返回结果.

1
2
3
4
5
?page=10  指定返回的页面
?offset=10  指定返回记录的开始位置
?page=2&per_page=100  指定返回第几页,并在页面上显示多少记录数
?sortby=name&order=asc  指定返回结果按照哪个属性排序,以及排序顺序
?animal_type_id=1  指定筛选条件

状态码:

1
2
3
4
5
6
7
8
9
10
11
12
200  ok : 服务器成功返回用户请求的数据
201  created  : 用户新建或修改数据成功
202  accepted  : 表示一个请求已经进入后台排队(异步任务)
204  no content : 用户删除数据成功
400  invalid request : 用户发出的请求有误,服务器没有新建或修改数据的操作
401  unauthorized : 表示用户咩有权限(令牌,用户名,密码错误)
403  forbidden : 表示用户得到授权,但是访问是被禁止的
404  not found : 用户发出的请求针对的是不存在的记录,服务器没有进行操作
406  not acceptable : 用户请求的格式不对(比如用户请求json格式,但是只有xml格式)
410  gone : 用户请求的资源被永久删除
422  unprocesable entity : 当创建一个对象时,发生一个验证错误
500  internal server error : 服务器发生错误,用户无法判断发出的请求是否成功

三  序列化

# api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把**数据转换格式**

# 序列化 : 把我们识别的数据转换成指定的格式提供给别人。

例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

# 反序列化 : 把别人提供的数据转换/还原成我们需要的格式。

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

四  Django RestFramework(DRF)

# 核心思想: 缩减编写api接口代码
# 建立在Django基础之上的Web应用开发框架. 可以快速开发的REST API接口应用.
# 在 REST framework 中, 提供了序列化器Serializer的定义方法,简化序列化的过程
# 还提供丰富的类视图、扩展类、视图集来简化视图的编写工作.
# REST framework 还提供了:认证 , 权限 ,过滤 ,分页 ,接口文档等功能支持.

本文只介绍DRF的最精简的架构使用流程,

仅仅包含DRF的APIView组件 序列化组件 解析器组件

五  简易流程

### 序列化器
# 如有子应用,可以在子应用中创建seriaizers.py用于保存序列化器
 
# 创建序列化器类,后面会在视图函数中调用
    from rest_framework import serializers
    from .models import Student
 
    class StudentModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = "__all__"
         
# model 指定序列化器处理的数据字段从模型类Student参考生成
# fields 指明该序列化器包含模型类中的哪些字段 'all' 全字段
# serializers有serializers.ModelSerializer还有serializers.Serializer多种序列化器类

  

### 视图函数 views.py
    from rest_framework.viewsets import ModelViewSet
    from .models import Student
    from .serializers import StudentModelSerializer
    # Create your views here.
 
    class StudentViewSet(ModelViewSet):
        # 查询 模型数据
        queryset = Student.objects.all()
        # 指定 序列化器类
        serializer_class = StudentModelSerializer
 
#  queryset 指名该视图集在查询数据时使用的查询集,固定参数名
#  serializer_class 指明该视图在进行序列化反序列化使用的序列化器,固定参数名

 

### 路由定义
    from . import views
    from rest_framework.routers import DefaultRouter
 
    # 路由列表
    urlpatterns = []
 
    router = DefaultRouter()  # 可以处理视图的路由器
    router.register('students', views.StudentViewSet)  # 向路由器中注册视图集
 
    urlpatterns += router.urls  # 将路由器中的所以路由信息追到到django的路由列表中

  

 

posted @   EricYJChung  阅读(367)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示