zoukankan      html  css  js  c++  java
  • DRF中的APIView源码分析

    首先写一个简单的drf接口

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    # 基于drf写接口,cbv
    class DrfTest(APIView):
        def get(self, request,*args,**kwargs):
            print(type(request._request))
            print(type(request))
            print(request.POST)
            print(request.GET)
            response = {'status':100,'errors':None}
            response['users'] = user_list
            return Response(response)
    
        def post(self,request,*args,**kwargs):
            name = request.data.get('name')
            print(name)
            return HttpResponse('ok')
    
    url(r'DrfTest/',views.DrfTest.as_view()),
    

    通过路由配置 点入查看源码,首先进入到APIView的as_view的方法中:

    查找dispatch方法:


    如果自己所定义的class DrfTest(APIView)没有手撸dispatch的情况下,下一步,找到APIView里的dispatch方法:

    当中有一个self.initial(request, *args, **kwargs)方法:

    至此,简单分析如上:回到最开始定义类的过程:

    流程总结:

    • 请求来了,执行了View类中as_view的view()方法,本质上执行了self.dispatch方法
    • 按顺序查找dispatch方法(自己类中,父类中,父父类中...)
    • 在APIView中的dispatch方法中先把原来request封装进去,变成新的request对象
    • 接下来又执行了三个组件,分别是认证,权限和频率
    • 如果三个中有一个不满足,则不继续执行
    • 再走分发方法,最后返回response出去
      即在请求进入视图函数前加了一些东西,重写了dispatch方法

    dispatch方法:

    • 传入的request是原生的request对象
    • 这个request已经不是原生的request了,但是它内部有个原生的request对象
    • request = self.initialize_request(request, *args, **kwargs)
    • self.initial(request, *args, **kwargs)这里面有权限,认证,频率
  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/wanlei/p/10411833.html
Copyright © 2011-2022 走看看