• 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最后处理,内容决策
  • 相关阅读:
    二分类实现多分类
    目标检测(三) Fast R-CNN
    目标检测(二) SPPNet
    目标检测(一) R-CNN
    超参数调优
    支持向量机 SVM
    LDA 线性判别分析
    分类
    特征选择
    集成学习-Adaboost 参数选择
  • 原文地址:https://www.cnblogs.com/iread9527/p/13461998.html
Copyright © 2020-2023  润新知