DjangoRestFramework整体结构---DjangoRestFramework处理一个接口请求的完整流程

  • 首先我们来看看,一个接口请求到了DjangorestFramework中是怎么处理,整个处理的流程是怎样的

    • 首先接口匹配到路由中的url,进入APIView类中的as_view()入口方法,然后调用APIView类中的dispatch()方法,initialize_request方法做的事情有:后缀获取,内容决策,版本检测,用户认证,权限检查,节流检查,最后根据请求方法名分发接口请求
    • 请求到了对应方法的mixin中,经过一系列serializers类的处理,比如数据的序列化反序列化,数据的验证,数据存入数据库,从数据库中读取数据
    • 请求回到APIView类中处理,返回响应结果,没有异常正常处理,有异常会异常捕获,最后的结果赋值给self.response属性
  • 以下是DjangoRestFramework处理一个请求的类继承关系,需要结合源码看(打断点)

  • ModelViewSet类

    • 继承
      • CreateModelMixin类
        • save()方法
          • serilizers中的create()方法
      • RetrieveModelMixin类
      • UpdateModelMixin类
        • save()方法
          • serilizers中的update()方法
      • DestroyModelMixin类
      • ListModelMixin类
      • GenericViewSet类
        • 继承
          • ViewSetMixin类
            • 重写了as_view()方法, 根据self.action映射字段get:list, get:retrive来调用,最终决定list,create方法调用
          • GenericAPIView类
            • 继承
              • APIView类
                • 继承Django中的View类
                  • 继承object
                    • as_view()方法,接口入口函数,调用dispatch方法
                    • dispatch()方法,根据请求方法名调用实际业务代码
                • 重写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后续判定权限
                    • 权限检查
                      • ListCreateAPIView
                        • check_permissions方法
                          • get_permissions()就是permission_class中的类
                          • 继承BasePermission的类实现has_permission()方法,返回布尔类型,从而为所有请求判断权限,鉴权失败返回403
                    • 节流检查
                      • check_throttles()
                        • get_throttles()
                          • 继承BaseThrottle的类实现allow_request()方法,返回结果是布尔类型
                          • 节流成功,抛出异常
                          • 节流失败,走正常请求流程
                  • 根据请求方法名分发接口请求
                    • 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
                      • 不存在视图函数直接拒绝,抛出异常
                    • 没有异常正常处理
                    • 有异常会异常捕获
                  • self.response = self.finalize_response(request, response, *args, **kwargs)
                    • 对response最后处理,内容决策
原文地址:https://www.cnblogs.com/iread9527/p/13461998.html