Django Rest Framework 源码解读(一)简介及生命周期

1,501 阅读3分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

1 什么是drf?

python项目开发中,前后端分离的技术框架越来越成熟,在前后端进行通信时,通常需要用统一的格式进行通信,目前应用比较广泛的是RESTful API。那后端如何快速编写基于Django的RESTful API呢?本篇将主要介绍使用DjangoRestFramework(drf)框架来快速开发符合REST风格的API。

2 为什么用drf?

  1. 提供了可视化的API调试界面,开发者可以在线测试接口
  2. 可以根据需求来选择常规视图功能或更高级的功能
  3. 不用自己写大量的CRUD接口了,简单配置即可
  4. 支持ORM(对象映射关系)和非ORM的数据序列化
# 安装drf
pip install  djangorestframework

# 具体功能在具体模块下
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.exceptions import APIException
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.settings import APISettings

# 注册drfapp
INSTALLED_APPS = [
    ...
    'rest_framework',
]

as_view: 就干了一件事,禁用csrf认证

三大认证任务分析

  • **认证模块:**校验用户是是否登陆
self.perform_authentication(request)
  • **权限模块:**校验用户是否拥有权限
self.check_permissionsn(request)
  • **节流模块:**访问接口的次数在设定的时间范围内是否过快(配置访问频率、缓存计次、超次后需要等待的时间)
self.check_throttles(request)

3 Django请求生命周期

  • 前端发送请求

  • wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)

  • 中间件处理请求,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session

  • 路由匹配,根据当前请求的URL找到视图函数,如果是FBV写法,通过判断method两类型,找到对应的视图函数;如果是CBV写法,匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行

  • 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、view视图将数据渲染到template模板

  • 视图函数执行完毕之后,会把客户端想要的数据返回给dispatch方法,由dispatch方法把数据返回经客户端

  • 中间件处理响应

  • wsgi,将响应的内容发送给浏览器

  • 浏览器渲染

4 drf请求生命周期

前端发送请求 --> Django的wsgi --> 中间件 --> 路由系统_执行CBV的as_view(),就是执行内部的dispath方法 --> 在执行dispath之前,有版本分析和渲染器 --> 在dispath内,对request封装 --> 版本 --> 认证 --> 权限 --> 限流 --> 通过反射执行视图函数 --> 如果视图用到缓存( request.data or request.query_params )就用到了 解析器 --> 视图处理数据,用到了序列化(对数据进行序列化或验证) --> 视图返回数据可以用到分页