首页 > 编程语言 >drf源码剖析----as_view()

drf源码剖析----as_view()

时间:2024-03-06 21:47:16浏览次数:19  
标签:return self request ---- 源码 view def cls

点击查看代码
path('example/', views.ExampleView.as_view())
# as_view()作为入口函数,先去类ExampleView()中找as_view()函数
点击查看代码
# 类ExampleView()中没有找到,去父类APIView()中找as_view()函数
class ExampleView(APIView):

    def get(self, request):
        return Response('get')

    def post(self, request):
        return Response('post')

    def put(self, request):
        return Response('put')
点击查看代码
class APIView(View):
    @classmethod
    def as_view(cls, **initkwargs):
        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

        view = super().as_view(**initkwargs)  
        # 将父类View中()的as_view()函数返回给view
        view.cls = cls
        view.initkwargs = initkwargs

        return csrf_exempt(view)
        # 返回免除csrf认证的view()函数
点击查看代码
class View:
    @classonlymethod
    def as_view(cls, **initkwargs):
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError(
                    "The method name %s is not accepted as a keyword argument "
                    "to %s()." % (key, cls.__name__)
                )
            if not hasattr(cls, key):
                raise TypeError(
                    "%s() received an invalid keyword %r. as_view "
                    "only accepts arguments that are already "
                    "attributes of the class." % (cls.__name__, key)
                )

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            if not hasattr(self, "request"):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)

        return view

    def dispatch(self, 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
        return handler(request, *args, **kwargs)
        # 用反射得到请求函数并返回

标签:return,self,request,----,源码,view,def,cls
From: https://www.cnblogs.com/only-you-zta/p/18057659

相关文章

  • 通过canvas实现鼠标绘图的注意点
    问题情景:想设置全屏canvas时,直接修改了canvas的css样式为width:100%。出现问题:绘图时坐标不对应且有明显放大感。问题原因:css中width是将canvas尺寸直接放大,而实际需要的是修改canvas本身的尺寸。解决办法:直接定义canvas.width和canvas.height。我用的是vue3所以用了onMount......
  • spring - string
    spring-string1.string在Java8及之前的版本中,字符串由不可变的Unicode字符数组组成。然而,大多数字符只需要8位(1个字节)来表示它们,而不是16位(字符大小)。为了改善内存消耗和性能,Java9引入了紧凑字符串。这意味着如果字符串仅包含1字节字符,它将使用Latin-1编码表示......
  • bitset 相关优化
    bitset基础用法operator[]:访问其特定的一位。operator==/!=:比较两个bitset内容是否完全一样。operator&/&=/|/|=/^/^=/~:进行按位与/或/异或/取反操作。bitset只能与bitset进行位运算,若要和整型进行位运算,要先将整型转换为bitset。operator<>/<<=/>>=:进行......
  • 数组
    数组中的数据叫元素      注意:计算机中是从0开始计数但日常中人们习惯从1开始计数,当数据需要普通人看的时候应当遵从日程的习惯从1开始计数 数组的遍历求和  看需要定义的数组能不能直接写出来,能就静态不能就动态   根据图来回忆流......
  • ABC323E Playlist 题解
    考虑第\(i\)时刻时,第\(j\)首歌刚好结束与第\(i-j\)时刻有关,因此设\(dp_{i,j}\)表示第\(i\)时刻第\(j\)首歌刚好结束的概率,那么\(dp\)转移方程为:\[dp_{i,j}=\sum\limits_{k=1}^ndp_{i-t_j,k}\]很容易想到记录\(\sum\limits_{j=1}^ndp_{i,j}\)的值为\(sum_i\),......
  • 初中英语优秀范文100篇-099Keep patient when facing difficulties-面对困难时保持耐
    PDF格式公众号回复关键字:SHCZFW099记忆树1IstillrememberthefirsttimeIrodeabicyclewhenIwasseven.翻译我仍然记得我七岁时第一次骑自行车的情景简化记忆自行车句子结构主语I表示我谓语stillremember仍然记得宾语从句thefirsttimeIrodea......
  • AI时代:大模型开发framework之langchain和huggingface
    langchain:提供了大模型相关应用开发的所有便利。https://python.langchain.com/docs/get_started/introductionBuildyourLLMapplicationwithLangChainTraceyourLLMapplicationwithLangSmithServeyourLLMapplicationwithLangServecookbook:Prompt+LLMRAG......
  • 费马素性检验(python实现)
    费马素性检验:给定奇整数n>=3和安全参数t1、随机选取整数b,(b,n)=1,2<=b<=n-22、计算r=b的n-1次方(modn)3、如果r!=1,则n是合数4、上述过程重复t次以下是python代码,如发现错误,请跟博主联系importrandom#n>=3且n是奇整数n=int(input())t=int(input())defgcd(a,b):wh......
  • P1894 [USACO4.2] 完美的牛栏The Perfect Stall
    原题链接题解二分图匹配,总的来说就是如果我的位子没人霸占,那我就坐,如果没人霸占,那我尝试着让他滚蛋如果一个位子经历过两次滚蛋,说明别人确实没位子坐了,人家确实需要这个位子,那我就换一个位子code#include<bits/stdc++.h>usingnamespacestd;intbelong[205]={0};intvis[......
  • Git提交
    之前用过git一段时间,在一位学长的带领下用git团队开发协作了一个vue的小程序,在很长一段时间里面就没有用过git了,近段时间研究了一下springboot,写了个小demo,把他上传到github上,突然发现,自己对git的命令完全忘了。。。。。下面把这些命令记在博客上,以防再次遗忘。gitinit初始化......