FBV与CBV 及CBV源码分析

FBV与CBV 及CBV源码分析

FBV(Function Based View) 基于函数的视图

基于函数的视图,我们一直在用没啥好讲的,就是导入模块调用函数执行业务

CBV(Class Based View) 基于类的视图

路由

from app01 import views

url(r'^haha/',views.zx_view.as_view()),

视图

class zx_view(View):
    def get(self,request):
        return render(request,'edit.html')
    def post(self,request):
        return HttpResponse("你好我是POST")

CBV源码分析

首先我们的路由竟然是一个函数(),这样的话是直接执行的,我们找到返回值就行

url(r'^haha/',views.zx_view.as_view()),

进入源码

@classonlymethod
    def as_view(cls, **initkwargs):
        """
        Main entry point for a request-response process.
        """
        #views.zx_view.as_view(),我们调用的时候并没有传递关键字参数,所以这个for可以跳过
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError("You tried to pass in the %s method name as a "
                                "keyword argument to %s(). Don't do that."
                                % (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)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)
        #这里在给函数对象添加属性
        view.view_class = cls
        view.view_initkwargs = initkwargs
        #下面的代码有注释,可以知道大概的功能
        # take name and docstring from class
        update_wrapper(view, cls, updated=())

        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(view, cls.dispatch, assigned=())
        #最后把函数对象给返回去了
        return view

路由就相当于是这个了

那么就和FBV一样了,路由触发函数的执行

url(r'^haha/',view),

触发路由查看view是怎么执行的

def view(request, *args, **kwargs):
            #这个self是什么,就是我们之前创建的zx_view类对象,这里直接实例化了一个self对象
            self = cls(**initkwargs)
            #通过反射获取get方法
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            #给self对象添加属性
            self.request = request
            self.args = args
            self.kwargs = kwargs
            #最后执行self.dispatch(request, *args, **kwargs)
            return self.dispatch(request, *args, **kwargs)

self.dispatch我们知道我们的zx_view是没有这个方法的,那么就去它的父类找dispatch这个方法,结果找到了

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        #获取请求方法并转换成小写,判断是否在http_method_names,http_method_names信息下面那段代码
        if request.method.lower() in self.http_method_names:
            #通过反射拿到zx_view的get或者post函数对象
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        #执行zx_view的get或者post函数对象,并返回结果,结束
        return handler(request, *args, **kwargs)
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

原文地址:https://www.cnblogs.com/zx125/p/11729062.html

时间: 2024-10-10 09:49:23

FBV与CBV 及CBV源码分析的相关文章

Django CBV流程及源码分析

Django 实现视图的方法有两种,一种是FBV(function base view)即基于函数的视图,还一种高级的就是CBV(class base view),通过阅读源码你会发现它本质上还是基于FBV的.FBV的优点是用法和写法都比较简单适合刚开始学的同学使用,缺点就是不能用的面向对象的几大特性只用函数进行封装代码多的时候会显得代码很冗余,而CBV就很好的解决了这些问题.并且Django官方在后面的Django版本中加入了很多基于CBV的类,方便我们快速开发.我们先简单的看下Django在

Django框架 --CBV源码分析、restful规范、restframework框架

一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view()) 2.as_view方法 as_view是一个类方法,实际上是一个闭包函数(内层函数包含对外层作用域的使用) 请求来了以后,调用as_view方法,调用函数中的view方法,view方法是调用了dispatch方法 @classonlymethod def as_view(cls, **initkwargs): def view(req

CBV源码分析

FBV和CBV FBV(function base views) : 在视图层中使用函数处理请求 CBV(class base views): 在视图层中使用类处理请求 Python是一个面向对象的编程语言, 面向对象的优点(继承,封装,多态), 使用CBV,用类写view,这样的做的优点: 提高代码的服用性,可以使用面向对象的技术,比如Mixin(多继承) 可以用不同的函数针对不同的HTTP方法处理,而不是用过if判断,提高代码的可读性 CBV简单示例 # 在urls.py中进行路由配置 ur

Django中CBV和Restful API中的APIView源码分析

Django中CBV和Restful API中的APIView源码分析 python的Django框架的视图处理可以用FBV, 也可以采用CBV.首先定义一个CBV视图: from django.views import Viewfrom django.http import JsonResponseclass Book(View):    def get(self, request):        ll = [{'key':value}]        return JsonResponse

Django rest framework源码分析(一) 认证

一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧.我承认我是故意的,因为我始终觉得,如果好的技术服务于企业,顺便的提高一下自己.大家都很开心不是不.再次强调一下,真的只是顺便. 安装吧 pip install djangorestframework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework

Django-jwt token生成源码分析

一. 认证的发展历程简介 这里真的很简单的提一下认证的发展历程.以前大都是采用cookie.session的形式来进行客户端的认证,带来的结果就是在数据库上大量存储session导致数据库压力增大,大致流程如下: 在该场景下,分布式.集群.缓存数据库应运而生,认证的过程大致如下: 不过该方式还是缓解不了数据库压力,一个项目中应该尽可能多的减少IO操作,于是后来采用签名的方式,在服务端只保存token的签名算法,当客户端认证时,只需用算法去生成或是判断token的合法性即可.大致方式如下: 二.

TeamTalk源码分析之login_server

login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是8080,客户端登录服务器地址配置如下(这里是win版本客户端): 1.login_server启动流程 login_server的启动是从login_server.cpp中的main函数开始的,login_server.cpp所在工程路径为server\src\login_server.下表是logi

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu