zoukankan      html  css  js  c++  java
  • drf——APIView及其内部函数/类的源码分析

    一、知识储备

    1 APIview的as_view
        -内部还是执行了View的闭包函数view
        -禁用掉了csrf
        -一切皆对象,函数也是对象  函数地址.name=lili
    
    2 原生View类中过的as_view中的闭包函数view
        -本质执行了self.dispatch(request, *args, **kwargs),执行的是APIView的dispatch

    二、APIView的源码分析

    # drf:APIView的源码分析
    
        def as_view(cls, **initkwargs):
            # 这句话执行完成返回 view闭包函数的内存地址
            view = super().as_view(**initkwargs) # 调用父类(View)的as_view
            view.cls = cls
            view.initkwargs = initkwargs
            view=csrf_exempt(view)  # 局部禁用csrf
            return view
    
     # 装饰器的使用方式
    @csrf_exempt   ====>view=csrf_exempt(view)
    def view():
        pass
    
    # 请求来了,会执行上面返回的view()---->self.dispatch(APIView的dispatch)

    三、APIView的dispatch源码分析

    # APIView的dispatch源码分析
        def dispatch(self, request, *args, **kwargs):
         # 把原生的request,封装进新的Request对象(drf的Request)
            # DRF的Request类的对象,内部有request._request,它就是原生request
            request = self.initialize_request(request, *args, **kwargs)
            self.request = request
    
            try:
                self.initial(request, *args, **kwargs)
                '''
                #认证,权限,频率
                self.perform_authentication(request)
                self.check_permissions(request)
                self.check_throttles(request)
                '''
                if request.method.lower() in self.http_method_names:
                    handler = getattr(self, request.method.lower(),
                                      self.http_method_not_allowed)
                else:
                    handler = self.http_method_not_allowed
           # 这个request新的requst,是drf中Request对象
           # response是原生response
                response = handler(request, *args, **kwargs)
    
            except Exception as exc:
                # 全局的异常捕获
                response = self.handle_exception(exc)
            # 把视图函数(类)返回的response,又包装了一下
            self.response = self.finalize_response(request, response, *args, **kwargs)
            return self.response

    四、Request类分析

    Request类
        -request._request:原生request
        -request.data    : post请求提交的数据(urlencoded,json,formdata)
        -request.user    :不是原生的user了
        -request.query_params :原生的request.GET,为了遵循restful规范
        -requset.FILES   :新的
        -重写了__getattr__,新的request.原来所有的属性和方法,都能直接拿到
            def __getattr__(self, attr):
                return getattr(self._request, attr)
  • 相关阅读:
    我们的微信小程序开发
    node.js的模块引用
    关于 node.js的request事件
    关于 node.js 小插曲
    发给
    Kotlin 委托(1)类委托、变量委托注意事项
    Kotlin 扩展
    关于dex 64K 引用限制
    c++新特性实验(5)声明与定义:属性列表(C++11 起)
    apk反编译(6)用ProGuard 混淆、压缩代码,压缩资源。
  • 原文地址:https://www.cnblogs.com/guojieying/p/13927967.html
Copyright © 2011-2022 走看看