首页 > 编程语言 >drf源码剖析----request

drf源码剖析----request

时间:2024-03-06 23:12:53浏览次数:19  
标签:__ f1 self args request ---- 源码 kwargs

点击查看代码
源码解析:
#  请求函数内的request,*args, **kwargs传给父类APIView内的dispatch()函数
    def dispatch(self, request, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs
# request,*args, **kwargs传给self.initialize_request(request, *args, **kwargs)进行封装
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?

        try:
            self.initial(request, *args, **kwargs)

            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

            response = handler(request, *args, **kwargs)

        except Exception as exc:
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

    def initialize_request(self, request, *args, **kwargs):
        parser_context = self.get_parser_context(request)
# 将request传给类Request()
        return Request(
            request,
            parsers=self.get_parsers(),
            authenticators=self.get_authenticators(),
            negotiator=self.get_content_negotiator(),
            parser_context=parser_context
        )
点击查看代码
class Request:

    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            .format(request.__class__.__module__, request.__class__.__name__)
        )
        # 原装的request封装为self._request
        self._request = request
点击查看代码
# __getattr__当调用的对象的属性不存在时触发
# __getattribute__无论调用对象的属性是否存在,都会执行该函数

class HttpRequest(object):

    def __init__(self):
        pass

    def f1(self):
        print('f1')

    def f2(self):
        print('f2')


class Request(object):

    def __init__(self, req, m):
        self._request = req   # 此处见源码解析
        self.m = m
        print(self.args)  
        print(self.kwargs)
    
    def __getattr__(self, item):   # 2.Request中不存在f1, 执行__getattr__
        try:                   # 3.如果HttpRequest中存在f1,继续执行
            return getattr(self._request, item)  
        except AttributeError:
            return self.__getattribute__(item)
            #  3.如果HttpRequest中不存在f1,继续在Request中寻找f1,没有则报错


httprequest = HttpRequest()
httprequest.f1()
httprequest.f2()

# 将实例化对象httprequest以参数形式传给Request()
request = Request(httprequest, 123)   
request._request.f1()  # 此处见源码解析
request.f1()   # 1. 函数开始执行
点击查看代码
结果:
f1
f2
f1
f1

标签:__,f1,self,args,request,----,源码,kwargs
From: https://www.cnblogs.com/only-you-zta/p/18057781

相关文章

  • 大语言模型常见的文本切分方式整理汇总
    整理本文整理了一些简单的文本切分方式,适用于大语言模型经典应用RAG或相似场景。一般切分如果不借助任何包,很容易想到如下切分方案:text="我是一个名为ChatGLM3-6B的人工智能助手,是基于清华大学KEG实验室和智谱AI公司于2023年共同训练的语言模型开发的。我的目标是......
  • 为什么数学分析这么好,这么妙
    Thesetofrealnumbershasseveralstandardstructures:Anorder:eachnumberiseitherlessthanorgreaterthananyothernumber.Algebraicstructure:thereareoperationsofadditionandmultiplication,thefirstofwhichmakesitintoagroupandth......
  • pp_orange 的新poly模版
    点击查看代码namespacePoly{int*r[23];intrr[MAX<<1];structpolyinit{ polyinit(){ intnw=1; intlen=1; while(nw+len<=(MAX<<1)){ intpos=lg(len); r[pos]=rr+nw; rep(i,1,len)r[pos][i]=(r[pos][i>>1]>>1)|((i&a......
  • HTML+CSS 实现简单打印页
    代码:<!DOCTYPEhtml><html><head><title>分页打印示例</title><style>/*打印样式*/@mediaprint{.page{page-break-after:always;/*每个.page元素后都分页*/}}</style>......
  • P1550 [USACO08OCT] Watering Hole G
    原题链接题解思维转换,想象井里的水都来自山上,并把山看成一个点,那么这道题就变成了最小生成树简证最小生成树原理:按边权排序,然后遍历,如果这条边的两个点之前每连过,那么就连上,因为这就是这两个点所在集合之间的最短路径了,不然这条边没必要加,因为已经联通了算是一种贪心?code#i......
  • web实时消息推送方案 - (重要~个人简历要引申)
    一什么是消息推送推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用。消息推送通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备APP进行的主动消息推送。消息推送一般又分为Web端消息推送和移动端消息推送。......
  • Ubuntu安装zabbix配置教程
    Ubuntu镜像下载:https://mirrors.aliyun.com/ubuntu-releases/20.04.6/ubuntu-20.04.6-live-server-amd64.isoUbuntu在vm虚拟机安装(如下未提及项均保持默认选项)1、配置软件源为阿里云,http://mirrors.aliyun.com/ubuntu 2、配置服务器名称和用户名密码 3、安装ssh服务,......
  • 1.Prefix前缀和【模板】
    [[#题目描述|题目描述]][[#输入描述|输入描述]][[#输出描述|输出描述]][[#输入样例1|输入样例1]][[#输出样例1|输出样例1]][[#暴力穷举|暴力穷举]][[#前缀和数组|前缀和数组]]题目描述给定义一个数组a,有q次询问,对于每次询问:给定两个整数l,r,求出${a_l}$$+$${a_{l+1}}$......
  • 2024.3.6学习笔记
    1.InfoNCEloss(源自知乎https://zhuanlan.zhihu.com/p/506544456)1.引入把对比学习看成是一个字典查询的任务,即训练一个编码器从而去做字典查询的任务。假设已经有一个编码好的queryq以及一系列编码好的样本k0,k1,k2...,把k0,k1,k2...可以看作是字典里的key。假设只有一......
  • 2.diff差分【模板】
    [[#差分数组|差分数组]][[#差分数组#三个数组的关系|三个数组的关系]][[#题目描述|题目描述]][[#输入描述|输入描述]][[#输出描述|输出描述]][[#输入样例1|输入样例1]][[#输出样例1|输出样例1]]差分数组如下叫做差分数组\[d_{i}=a_{i}-a_{i-1}\]又有\[\su......