DjangoRestFramework整体结构---DjangoRestFramework处理一个接口请求的完整流程
-
首先我们来看看,一个接口请求到了DjangorestFramework中是怎么处理,整个处理的流程是怎样的
- 首先接口匹配到路由中的url,进入APIView类中的as_view()入口方法,然后调用APIView类中的dispatch()方法,initialize_request方法做的事情有:后缀获取,内容决策,版本检测,用户认证,权限检查,节流检查,最后根据请求方法名分发接口请求
- 请求到了对应方法的mixin中,经过一系列serializers类的处理,比如数据的序列化反序列化,数据的验证,数据存入数据库,从数据库中读取数据
- 请求回到APIView类中处理,返回响应结果,没有异常正常处理,有异常会异常捕获,最后的结果赋值给self.response属性
-
以下是DjangoRestFramework处理一个请求的类继承关系,需要结合源码看(打断点)
-
ModelViewSet类
- 继承
- CreateModelMixin类
- save()方法
- serilizers中的create()方法
- save()方法
- RetrieveModelMixin类
- UpdateModelMixin类
- save()方法
- serilizers中的update()方法
- save()方法
- DestroyModelMixin类
- ListModelMixin类
- GenericViewSet类
- 继承
- ViewSetMixin类
- 重写了as_view()方法, 根据self.action映射字段get:list, get:retrive来调用,最终决定list,create方法调用
- GenericAPIView类
- 继承
- APIView类
- 继承Django中的View类
- 继承object
- as_view()方法,接口入口函数,调用dispatch方法
- dispatch()方法,根据请求方法名调用实际业务代码
- 继承object
- 重写as_view()方法
- 调用父类中的as_view()方法
- 重写dispatch()方法
- initialize_request
- Django中的request变成DRF中的request
- initial
- 后缀获取,get_format_suffix()方法
- 内容决策,perform_content_negotiation()方法
- 版本检测,determine_version()方法
- 用户认证
- perform_authentication()方法
- 这里的request是把django中的request转成drf中的request,requet.user就是user,request.auth就是令牌
- request.user 认证成功的结果就是数据库里面有该用户(密码正确),返回request.user,否则就是认证失败,返回401
- _authenticate()
- get_authenticators()就是authentication_classes那些认证类
- 继承BaseAuthentication的类实现authenticate()方法,返回结果是数组(user, auth),为所有的请求认证
- 认证之后凭借user,auth后续判定权限
- _authenticate()
- perform_authentication()方法
- 权限检查
- ListCreateAPIView
- check_permissions方法
- get_permissions()就是permission_class中的类
- 继承BasePermission的类实现has_permission()方法,返回布尔类型,从而为所有请求判断权限,鉴权失败返回403
- check_permissions方法
- ListCreateAPIView
- 节流检查
- check_throttles()
- get_throttles()
- 继承BaseThrottle的类实现allow_request()方法,返回结果是布尔类型
- 节流成功,抛出异常
- 节流失败,走正常请求流程
- get_throttles()
- check_throttles()
- 根据请求方法名分发接口请求
- response = handler()
- handler()方法
- 存在视图函数即调用开发者业务代码,也就是mixin中的增删改查代码
- mixin中对于更新,查询,删除方法,也就是针对单个资源的操作
- 调用GenericAPIView类中的get_object()方法
- 首先数据库中查询这个对象,根据queryset和lookup_field,查找不到直接返回404
- obj = get_object_or_404(queryset, **filter_kwargs)
- check_object_permissions()
- 继承BasePermission的类实现has_object_permission(),返回布尔类型,从而为单个资源的删改查判断权限,鉴权失败返回403
- 调用GenericAPIView类中的get_object()方法
- mixin中对于更新,查询,删除方法,也就是针对单个资源的操作
- 不存在视图函数直接拒绝,抛出异常
- 存在视图函数即调用开发者业务代码,也就是mixin中的增删改查代码
- 没有异常正常处理
- 有异常会异常捕获
- self.response = self.finalize_response(request, response, *args, **kwargs)
- 对response最后处理,内容决策
- initialize_request
- 继承Django中的View类
- APIView类
- 继承
- ViewSetMixin类
- 继承
- CreateModelMixin类
- 继承
我在想我要不要写一句励志的话......