CBV 源码剖析

FBV 和 CBV

FBV:funcation base view -- 基于函数的视图
CBV:class base view -- 基于类的视图
		1、先写一个类
  	2、继承 View
    3、url(r'^login/', views.Mylogin.as_view())

CBV 是根据请求方式区别访问哪个方法

"""
CBV
	- 能够直接根据请求方式不同直接匹配对应的方法执行
"""

CBV 源码

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^analysis', views.MyLogin.as_view())
  	'''
		函数名/方法名 加括号执行优先级最高
		猜测:
				1.as_view() 是被 @classmethod 修饰的类方法
				2.as_view() 是被 @staticmethod 修饰的静态方法
		'''
    # 由于上述代码在执行之后会立即执行并返回 view 方法的内存地址
    # 因此可以转化为 url(r'^analysis', views.view)
]

因此 CBV 与 FBV 在路由匹配上本质是一样的,都是路由对应函数的内存地址

def view(request, *args, **kwargs):
    self = cls(**initkwargs) ==> selg = MyLogin(**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) 

    def dispatch(self, request, *args, **kwargs):
        # 获取当前请求的小写格式,然后比对当前请求方式是否合法,http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            """
            反射:通过字符串来操作对象的属性或方法
            handler = getattr(自定义的类产生的对象,请求方式,找不到该请求方式的属性或方法时就会使用第三个参数)
            """
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
				# 自动调用自定义的方法




在查看 Python 源码时,一定要时刻牢记面相对象属性方法查找顺序
	- 先从对象自己找
  - 再去产生对象的类里找
  - 之后再去父类里找
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值