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)
(0)

相关推荐

  • 08 解析模块

    解析模块 为什么要配置解析模块 1)drf给我们提供了多种解析数据包方式的解析类 2)我们可以通过配置,来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析 3)全局配置就是针对每一个视图类,局部 ...

  • Python函数的参数是如何工作的?

    https://m.toutiao.com/is/Jwaod7L/ 我们先探讨在Python中如何将参数传递给函数的相关细节,然后回顾与这些概念相关的良好软件工程实践的一般理论. 通过了解Python ...

  • Django中关于“CSRF verification failed. Request aborted”的问题

    遇到该问题的情境 在Django中采用Ajax提交表单,涉及到跨域问题. 解决措施 在html页面中的表单内添加如下代码: {% csrf_token %} 在视图函数所在的py文件中添加如下代码: ...

  • 07 渲染模块

    渲染模块 源码入口 渲染模块 第四步: 对返回结果进行再次加工, self.response = self.finalize_response(request, response, *args, ** ...

  • drf—— JWT认证及基本使用

    一.JWT认证介绍 1 不再使用Session认证机制,而使用Json Web Token(本质就是token)认证机制,用户登录认证 2 用户只要登录了,返回用户一个token串(随机字符串),每次 ...

  • 06 请求模块:request对象

    源码入口:APIView类的dispatch方法中 request = self.initialize_request(request, *args, **kwargs) class Test(API ...

  • DRF认证流程及源码分析

    认证 前言 用户验证用户是否合法登陆. 部分内容在DRF视图的使用及源码流程分析讲解,建议先看讲解视图的这篇文章. 使用流程 认证使用的方法流程如下: 自定义认证类,继承BaseAuthenticat ...

  • netty中的发动机--EventLoop及其实现类NioEventLoop的源码分析 EventLoop

    EventLoop 在之前介绍Bootstrap的初始化以及启动过程时,我们多次接触了NioEventLoopGroup这个类,关于这个类的理解,还需要了解netty的线程模型.NioEventLoo ...

  • 设计模式(一)——Java单例模式(代码+源码分析)

    设计模式(一)——Java单例模式(代码+源码分析)

  • 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

  • Qt update刷新之源码分析(一)

    在做GUI开发时,要让控件刷新,会调用update函数:那么在调用了update函数后,Qt究竟基于什么原理.执行了什么代码使得屏幕上有变化?本文就带大家来探究探究其内部源码. Qt手册中关于QWid ...

  • 【老孟Flutter】源码分析系列之InheritedWidget

    老孟导读:这是2021年源码系列的第一篇文章,其实源码系列的文章不是特别受欢迎,一个原因是原理性的知识非常枯燥,我自己看源码的时候特别有感触,二是想把源码分析讲的通俗易懂非常困难,自己明白 和 让别人 ...

  • Wifi模块—源码分析Wifi热点的开启(Android P)

    一 前言 Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,它是一个安全中间件,代码位于external/wpa_supplicant,为各种无线网卡提供统一的安 ...

  • 协程库 libtask 源码分析

    本文在公司内网有不错的反响,但不同于传统的前端技术文章,所以阅读起来可能有点晦涩. 假设读者已经了解了协程的概念.实现协程的底层技术支持,基于底层基础,我们来看看如何实现协程以及协程的应用. 什么是 ...

  • 线程池ThreadPoolExecutor源码分析,看这一篇就够了

    前言 多线程是我们日常工作中很少能接触到的技术,但是面试的时候100%会被问到,万一工作中用到了基本不会,本篇咱们就来深入分析线程池的实现类ThreadPoolExecutor. 1.构造方法 构造方 ...