Django 的 cbv
正如我们了解到的,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 的 cbv的更多相关文章

  1. Django的CBV与FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...

  2. Django的 CBV和FBV

    FBV CBV 回顾多重继承和Mixin 回到顶部 FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以 ...

  3. Django 之 CBV & FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django随笔中,一直使用的是这种方式,不再赘述. CBV CBV(class base views) ...

  4. Django之CBV和FBV

    Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...

  5. django中CBV

    08.13自我总结 django中CBV 一.django处理业务逻辑的两种方式 FBV (function based views):使用函数来处理业务逻辑 CBV (class based vie ...

  6. django补充CBV和FBV模式

    django补充CBV和FBV模式FBV模式---函数:经常用的方式CBV模式---类CBV中url连接时函数名后面要接.as_view()class index(views.View): @... ...

  7. 使用Ajax (put delete ) django原生CBV 出现csrf token解决办法

    原因 django原生CBV中对于 Ajax put 或 delete 请求进行封装时,会把请求数据放在 request.body里, 所以获取不到csrf token 方式一: 关闭csrf 中间件 ...

  8. django中CBV源码分析

    前言:Django的视图处理方式有两种: FBV(function base views) 是在视图里基于函数形式处理请求. CBV(class base views)是在视图里基于类的形式处理请求. ...

  9. Django之 CBV和FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的 ...

随机推荐

  1. jenkins更新为国内源

    系统管理->插件管理->高级->升级站点->URL https://jenkins-zh.gitee.io/update-center-mirror/tsinghua/upda ...

  2. 《Linux就该这么学》自学笔记_ch21_使用Git分布式版本控制系统

    <Linux就该这么学>自学笔记_ch21_使用Git分布式版本控制系统 文章主要内容: 分布式版本控制系统 使用Git服务程序 提交数据 移除数据 移动数据 历史记录 还原数据 管理标签 ...

  3. Pycharm 个人认为舒服漂亮又好用的主题风格

    又开始和code打交道了系列…… 实验室换了新电脑,故而,重新安装了各种软件,乃至重新配置  Pycharm主题,找了好久,终于找到,想着应该mark一下,以备下次需要. 个人认为 Monokai 这 ...

  4. Python下的XML-RPC客户端和服务端实现(基于xmlrpclib SimpleXMLRPCServer 模块)

    RPC是Remote Procedure Call的缩写,翻译成中文就是远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立 ...

  5. 【剑指offer】数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  6. Matlab匿名函数

    Matlab可以通过function去定义一些功能函数,这使得代码变得简洁和高效.但是如果遇到的是一些简单的数学公式组成的函数表达式,继续用function去定义函数,似乎显得有些冗杂和多余.这时候, ...

  7. git new

    Quick setup — if you’ve done this kind of thing before Set up in Desktop or HTTPSSSH Get started by  ...

  8. C库函数strstr分析

    C标准库<string.h> 函数声明: char* strstr(char* const _String, char const* const _SubString) 返回值: SubS ...

  9. latex设置不同中英文字体

    latex中,中文我喜欢宋体,英文喜欢Courier New,于是,我分别设置了中英文字体,文章瞬间顺眼了很多. \documentclass[UTF8]{ctexart} \usepackage[a ...

  10. asp.net core mvc 集成miniprofiler

    原文:asp.net core mvc 集成miniprofiler asp.net core mvc 集成miniprofiler 一.环境介绍 二.监控asp.net 页面 三.监控执行的sql语 ...