美文网首页
Django 的 cbv

Django 的 cbv

作者: vckah | 来源:发表于2018-06-12 21:19 被阅读0次

正如我们了解到的,Django 写视图函数有两种写法:cbv 和 fbv。cbv 提倡使用类来写,fbv 使用函数来写。当然为了代码的重复行,官方更推荐使用 cbv。
写 cbv 时,写好 class 类视图,然后在 url 中调用 class 的 as_view() 函数,以前一直以为只要会调用即可,没有去理解内涵。当然 fbv 直接执行函数即可。今天来看一看 cbv 方式的源码。
在 PyCharm 中进入 as_view 的源码,发现其是一个 classmethod。

# 对具体代码省略
def as_view(cls, **initkwargs):
    # 是 request-response 过程主要入口点
    ... 
    def view(request, *args, **kwargs):
        ...
        return self.dispatch(request, *args, **kwargs)
    ...
    return view

可以看到内部使用呢闭包,返回了 view 函数,而 view 函数又返回了 dispatch 方法。那么继续进入 dispatch 方法。

# 这段代码不长
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)

可以看到其判断了 request.method.lower() 是否在一个列表中,这个列表是在 view 中的

http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

如果在列表中,那么取出 self 对应的方法。如果没有的话,那么也进入异常处理程序。这也就解释了 cbv 中的函数命名和 http method 高度重合。注意 getattr 的用法。
这就差不多结束了。整理一下:
as_view() --> view() --> dispatch()
这主要是利用了反射原理。url 映射也差不多是这个原理(猜测)。

总结:请求进入 dispatch 方法中,反射找到类中的 get/post 等方法,然后将对应方法中的返回内容返回给 dispatch,然后 dispatch 再将内容返回给请求。

后话:也可以在自定义类中实现 dispatch 方法,然后调用父类的方法。在这之前或之后可以实现某些操作。

相关文章

  • Django基础:drf 源码视图解析

    Django 与drf 源码视图解析 一.原生Django CBV 源码分析:View 二.drf CBV 源码分...

  • Django中的CBV

    django中请求处理方式有2种:FBV 和 CBV CBV CBV(class base views) 就是在视...

  • DRF进阶

    一、Django的FBV和CBV FBV:Function-base views基于函数的视图CBV:Class-...

  • Django 的 cbv

    正如我们了解到的,Django 写视图函数有两种写法:cbv 和 fbv。cbv 提倡使用类来写,fbv 使用函数...

  • django的cbv

    FBV FBV(function base views) 就是在视图里使用函数处理请求。 在之前django的学习...

  • Django使用CBV处理请求

    在Django中有两种基本的处理用户请求的方式,分别是FBV和CBV,这里讲的是关于使用CBV处理用户请求的方式 ...

  • Django之CBV

    CBV,即Class Base View,类基本视图。在写API时,我们通常都是使用CBV,而非FBV (Func...

  • Django中CBV

    一.django处理业务逻辑的两种方式 FBV (function based views):使用函数来处理业务逻...

  • 第三天

    drf开发商品列表页 django的view实现商品列表页&自带的serializer cbv => class ...

  • Django-FBV 和 CBV

    FBV 和 CBV django中请求处理方式有2种: FBV(function base views)** 就是...

网友评论

      本文标题:Django 的 cbv

      本文链接:https://www.haomeiwen.com/subject/ljnreftx.html