zoukankan      html  css  js  c++  java
  • 2. Django每日一码 之as_view() 源码

    2019-7-5  今日源码: as_view() 

    CBV与FBV路由区别

    urlpatterns = [
        url(r'^publish/$', views.Publishs.as_view()),  # CBV写法
        url(r'^publish/$', views.publish),    # FBV写法
    ]

    我们通过看FBV的写法可以得知,这里写的是一个内存地址,路由匹配成功会自动执行

    CBV写的是类.as_view(),加括号意味着在项目启动就会执行,那么我们大胆猜测,这里得到的也是一个函数地址。

    我们来搂一眼源码:

    果然,它返回了一个内存地址,而且是一个闭包函数

    也就是说当路由匹配成功的时候会调用内部的view加括号

    那我们需要进一步去看view里面干了些什么:

     我们发现它调用了dispatch方法,此时的self是我们的视图类对象,那么我们在查找dispatch方法时需要先从自身找,自身我们没有定义,那么此时就向父类找,最终在父类View里面找到了dispatch方法并调用

    我们知道了它调用了dispatch方法,那我们来View里看看dispatch里面干了些什么:

     if 判断 请求方式是不是属于默认8大请求方式之一,如果是,通过反射,拿到self中定义的请求方法的函数地址

    刚才我们说到,self是我们视图类的对象,那么这时候如果我们在视图类中定义了该请求方式同名的方法,那么就会走该方法。

     这个时候我们就应该有恍然大悟的感觉了,as_view()最终干的事情就是根据request请求方式来执行视图类的不同请求方法

  • 相关阅读:
    列出 visual studio 的所有快捷键
    CVS命令深入研究 zz
    大话系统之权限控制 (转)
    策略模式
    使用ISAPI_Rewrite对asp.net实现URL重写,显示HTML后缀
    使用ICSharpCode.SharpZipLib.dll实现在线解压缩
    ISAPI_REWRITE(转)
    ISAPI_Rewrite集
    做快乐的程序员(转)
    Request.PathInfo,Request.Path,RequestRawUrl
  • 原文地址:https://www.cnblogs.com/liqianglog/p/11134578.html
Copyright © 2011-2022 走看看