django中APIView里的dispatch和as_view方法分析

位置:

from rest_framework.views import APIView

继承APIView类视图形式的路由:

path('booksapiview/', views.BooksAPIView.as_view()),  #在这个地方应该写个函数内存地址

继承APIView类的视图函数:

from rest_framework.views import APIView

class BooksAPIView(APIView):
    def get(self):
        pass
    
    def post(self):
        pass

APIView源码分析:

继承了APIView的视图函数,最终执行的是APIView里的as_view方法

@classmethod
def as_view(cls, **initkwargs):
    """
    Store the original class on the view function.

    This allows us to discover information about the view when we do URL
    reverse lookups.  Used for breadcrumb generation.
    """
    if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
        def force_evaluation():
            raise RuntimeError(
                'Do not evaluate the `.queryset` attribute directly, '
                'as the result will be cached and reused between requests. '
                'Use `.all()` or call `.get_queryset()` instead.'
            )

        cls.queryset._fetch_all = force_evaluation

    # 1.调用APIView父类,也就是View类中的as_view方法,将其返回值view在赋值给view
    view = super().as_view(**initkwargs)
    # 2.这里践行了一切皆对象的原则,将cls这个视图类给了view.cls,下面哪个也是一样
    view.cls = cls
    view.initkwargs = initkwargs

    # Note: session based authentication is explicitly CSRF validated,
    # all other authentication is CSRF exempt.
    # 3.这句话的意思就是以后所有继承APIView的试图函数都没有csrf认证了,和View类一样,APIview类的as_view方法最后也返回了view
    # 只不过apiview新增了去除csrf认证这里
    return csrf_exempt(view)

注意:上述返回的view内存地址,需要去找dispatch方法是先去apiview里找,而不是view类中的dispatch了

apiview里的dispatch方法分析:

def dispatch(self, request, *args, **kwargs):
    """
    `.dispatch()` is pretty much the same as Django's regular dispatch,
    but with extra hooks for startup, finalize, and exception handling.
    """
    self.args = args
    self.kwargs = kwargs
    # 这里的request是self.initialize_request这个方法返回的新的由rest_framework中的Request类实例化产生的request对象
    request = self.initialize_request(request, *args, **kwargs)
    # 又把新的request对象给了视图函数中的request,从此,视图函数中的request就是新的request对象了
    self.request = request
    self.headers = self.default_response_headers  # deprecate?

    try:
        # 这里执行了apiview里的initial方法,这个方法里面包含了三大认证模块(重要)
        self.initial(request, *args, **kwargs)

        # Get the appropriate handler method
        # 三大认证过了之后,继续走,这里和view里面差不多,通过反射得到对应请求方式的函数地址
        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

        # 将get请求或者其他请求方式执行之后的结果在给response模块
        response = handler(request, *args, **kwargs)

    # 这里是三大认证出异常的异常模块
    except Exception as exc:
        response = self.handle_exception(exc)

    # 渲染模块,对response这个相应结果在进行包装(就是在前端看到的由rest_framework渲染出来的数据结果页面)
    self.response = self.finalize_response(request, response, *args, **kwargs)
    # 返回该渲染模块
    return self.response

def initial(self, request, *args, **kwargs):
    # 该方法最重要的就是下面三句代码
    # Ensure that the incoming request is permitted
    # 这个是认证组件
    self.perform_authentication(request)
    # 这个是权限组件
    self.check_permissions(request)
    # 这个是频率组件
    self.check_throttles(request)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中APIView里的dispatch和as_view方法分析 - Python技术站

(0)
上一篇 2023年4月2日 下午4:39
下一篇 2023年4月2日 下午4:39

相关文章

  • 面向对象介绍

    1.什么是面向对象和面向过程编程思想 面向过程: 1.核心是‘过程’二字2.过程的含义是将程序流程化3.过程是流水线,用来分步骤解决问题的 程序=数据+功能 面向对象: 1.核心是‘对象’二字2.对象的含义是将程序进行整合3.对象是‘容器’,用来盛放数据和功能(变量和函数) 总结:以做西红柿鸡蛋面为例: 面向过程:我需要买西红柿–》买鸡蛋、面–》把西红柿…

    2023年4月2日
    00
  • django中的路由层

    1.什么是路由层 简单来说,就是通过路由层中的path函数,告诉django遇到那个url,执行那个视图函数 2.路由层的请求流程 1.客户在浏览器输入网址→请求进入django的setting.py中的ROOT_URLCONF寻找指定使用的urls.py文件位置(如果中间件有路由功能,urls文件功能会被其替代) 2.Django会先匹配项目目录下的pat…

    Python开发 2023年4月2日
    00
  • 支付宝支付

    支付宝支付流程 在python中封装alipay 安装 >: pip install python-alipay-sdk –upgrade # 如果抛ssl相关错误,代表缺失该包 >: pip install pyopenssl 结构 libs ├── AliPay # aliapy二次封装包 │ ├── __init__.py # 包文件 │…

    2023年4月2日
    00
  • 路飞项目前端主页搭建

    前端主页 图片准备 首先把主页需要到图片资源放到项目的img文件夹下 页头组件:components/Header.vue <template> <div class=”header”> <div class=”slogan”> <p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活&lt…

    2023年4月2日
    00
  • 序列化组件

    序列化组件的三大功能 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 反序列化时同时会完成数据校验功能 序列化器Serializer使用方法 查询单个数据语法: 1.在setting.py中的app配置里注册一下drf 2.在dj…

    2023年4月2日
    00
  • form表单内容序列化的两种方法

    form表单内容序列化 form表单自带两种方法serialize()方法和serializeArray()方法 1.serialize()方法 描述:序列化表单内容为字符串(不包括文件),用于Ajax请求。 格式:var data = $(‘#form’).serialize(); 2.serializeArray()方法 描述:序列化表单元素(类似’.s…

    2023年4月2日
    00
  • 变量与常量

    1.什么是变量 变量是指可以变化的量,量指的是事物的状态,比如年龄,金钱、身高等等 2.为什么要有变量 为了能够让计算机像人一样记忆某一种事物的状态,并且这个状态是可以发生变化的。 程序的执行其实本质就是一系列状态的变化! 3.如何使用变量 (1)变量的基本使用 # 原则:先定义,再引用 name=’zhang’ print(name) (2) 内存管理(垃…

    2023年4月2日
    00
  • xadmin的使用

    安装 在项目的虚拟环境下执行 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 注意:xadmin对于不同django版本有不同的版本,一定要使用相对应的版本 在app中注册 INSTALLED_APPS = [ # … # xadmin主体模块 ‘xadmin’, # …

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部