django中CBV视图模式的View源码分析

位置:

1.找到自己项目用的解释器存储位置
H:\pythonProject\Lib\site-packages\django\views\generic\base.py
在base.py里有一个View类

2.也可以通过from django.views import View 按住ctrl点击View会直接跳到该类的位置

CBV形式的路由

path(r'^login/',views.MyLogin.as_view())

CBV形式的视图函数

from django.views import View
class MyLogin(View):
def get(self,request): #get请求时执行的函数
	return render(request,'form.html')
def post(self,request):  #post请求时执行的函数
	return HttpResponse('post方法')

CBV源码分析:

当上述的login请求来了之后---》会执行后面的views.MyLogin.as_view()---》这个地方应该放的是函数的内存地址,views.MyLogin.as_view()执行完,是个函数内存地址,---views.MyLogin.as_view()会去views.py中找到MyLogin这个类,然后找as_view()方法,发现没有--》去其父类中找就是View类中找---》执行as_view()方法最终返回的是一个View类内部的一个view函数内存地址---》然后django框架会自动给view这个函数加括号调用,再传入request这个参数--->而view这个内部函数返回的是return handler(request, *args, **kwargs)就是对应类中get或者post方法

as_view()方法分析:

@classonlymethod # 1.这个as_view是一个类方法,所以用类调用时,会自动把调用的类传入给这个函数的cls
def as_view(cls, **initkwargs):
    """Main entry point for a request-response process."""
    # 2.因为url那边没有传参,所以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)
            )

    # 3.执行该view函数
    def view(request, *args, **kwargs): # request是当次请求的数据
        # 5.cls是当前调用的类MyLogin,cls加括号产生对象给了self,这里现在self就是类MyLogin产生的对象
        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__
            )
        # 6.view函数返回了self.dispatch(request, *args, **kwargs)方法,
        # self本身没有dispatch方法,就去MyLogin中找,MyLogin没有就去View类中找,找到了
        return self.dispatch(request, *args, **kwargs)

    view.view_class = cls
    view.view_initkwargs = initkwargs

    # __name__ and __qualname__ are intentionally left unchanged as
    # view_class should be used to robustly determine the name of the view
    # instead.
    view.__doc__ = cls.__doc__
    view.__module__ = cls.__module__
    view.__annotations__ = cls.dispatch.__annotations__
    # Copy possible attributes set by decorators, e.g. @csrf_exempt, from
    # the dispatch method.
    view.__dict__.update(cls.dispatch.__dict__)

    # Mark the callback if the view class is async.
    if cls.view_is_async:
        view._is_coroutine = asyncio.coroutines._is_coroutine

    # 4.as_view返回的是该函数内部的view函数内存地址,所以具体读下view函数就行
    return view

上述as_view()方法返回了一个dispatch方法,dispatch方法分析:

# 1.dispatch将MyLogin这个类产生的对象self和request请求对象传入了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.
    # 2.判断request.method方法在不在http_method_names里,ttp_method_names对象里没有最后去View类里找到了
    if request.method.lower() in self.http_method_names:
        # 3.通过getattr方法反射,self.http_method_not_allowed这个就当没有前面的方法时的一个默认值
        # handler最后得到的就是MyLogin中定义的get或者post方法的内存地址
        handler = getattr(
            self, request.method.lower(), self.http_method_not_allowed
        )
    else:
        handler = self.http_method_not_allowed
    # 4.最后这个方法将handler加括号,再传入request参数调用的结果返回出去==执行了MyLogin的get或者post方法
    return handler(request, *args, **kwargs)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中CBV视图模式的View源码分析 - Python技术站

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

相关文章

  • django中操作mysql数据库

    1.准备工作(django连接数据库) 1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项 DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘python’, ‘USER’: ‘root’, ‘PASSW…

    2023年4月2日
    00
  • 自动生成路由和action的使用

    自动生成路由 普通cbv视图形式的路由: path(‘books4/’, views.Book4View.as_view()), re_path(‘books4/(?P<pk>\d+)’, views.Book4DetailView.as_view()) 继承了ViewSetMixin及其子类的视图路由: path(‘books5/’, view…

    Python开发 2023年4月2日
    00
  • python基础(待补充)

    第一篇:计算机的基础知识 编程语言的介绍    计算机介绍和五大组成 平台与软件跨平台介绍 CS、BS架构和网络通信协议 操作系统的介绍 cpu详解 存储器详解 操作系统启动流程和BIOS介绍 关于编辑器和解释型编译型语言 第二篇:python环境的搭建 python介绍和解释器的安装(暂略) python程序的运行方式和步骤 集成开发环境和虚拟环境介绍 第…

    Python开发 2023年4月2日
    00
  • 微信小程序的点击事件、页面跳转、数据绑定、数据修改、获取用户信息及定位、for指令、获取用户上传图片

    小程序中实现页面跳转 对标签绑定点击事件 data是点击时传入的参数 <view bindtap=”clickMe” data-nid=”123″ data-name=”SD” >点我跳转</view> /** * 用户点击事件 */ clickMe(e){ console.log(e) var nid = e.currentTarg…

    Python开发 2023年4月2日
    00
  • 修改密码弹出框搭建

    前端代码搭建 主要利用的是bootstrap3中js插件里的模态框版块 <li><a href=”” data-toggle=”modal” data-target=”.bs-example-modal-lg”>修改密码</a></li> <div class=”modal fade bs-example…

    Python开发 2023年4月2日
    00
  • CS、BS架构和网络通信协议

    1. CS架构 CS架构其实在我们身边比比皆是,手机里的app大多都是CS架构,比如腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频。 这里的腾讯视频是客服端client,腾讯也有一个自己的服务端server 这种自己开创一个客服端的方式叫做CS架构。 CS架构的好处是:可以自定义发送数据的格式与方式 2. BS架构 BS架构其实也是CS架构…

    2023年4月2日
    00
  • 基于django中间件的编程思想

    基于django中间件的编程思想 在django中,中间件的形式全部写成了列表套字符串的形式 MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middl…

    2023年4月2日
    00
  • 进程、线程补充与协程相关介绍

    补充点 1.死锁 当你知道锁的使用抢锁必须要释放锁,其实你在操作锁的时候也极其容易产生死锁现象(整个程序卡死 阻塞) from threading import Thread, Lock import time mutexA = Lock() mutexB = Lock() # 类只要加括号多次 产生的肯定是不同的对象 # 如果你想要实现多次加括号等到的是相…

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