一、什么的是CBV

cbv是class base view的缩写,是django中基于类来设计视图函数的,我们一开始接触的这种形式----path('login',views.login),叫fbv,是基于方法来设计视图函数的。

二、语法

from django.contrib import admin
from django.urls import path
from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('login',views.login1), #fbv
path('login/',views.LoginClass.as_view()) #cbv
]
from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here. def login1(request):
return class LoginClass(View): def get(self,request): return render(request,'login.html')
def post(self,request):
print(request.POST.get('user'))
print(request.POST.get('pwd'))
return HttpResponse('ok...')

views

三、as_view()源码分析

看cbv中,as_view()做了什么事情

 #as_view()源码执行流程
#@classonlymethod
def as_view(cls, **initkwargs): def view(request, *args, **kwargs):
self = cls(**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)
return view
#第一步:LoginClass.as_view(),执行as_view()方法,返回view方法名,
#第二步:相当于path('login/',view),当有请求时,执行view方法
#第三步:self = cls(**initkwargs),cls是类名--LoginClass,所以self是一个LoginClass实例对象
#第四步:return self.dispatch(request, *args, **kwargs) 执行dispatch方法
#第五步:self没有dispatch方法,去父类View中找,能找到dispatch
#第六步:如果请求方式--request.method.lower()在self.http_method_names列表中,利用反射在self实例对象中找到这个方法 赋值给handler
#第七步:执行handler ,将执行结果返回给调用者
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)

源码分析

最新文章

  1. 23种设计模式--单例模式-Singleton
  2. Socket通信基本原理
  3. 状态压缩 HDU1074
  4. IOS 遍历未知对象的属性和方法
  5. 深入SQL截取字符串(substring与patindex)的详解
  6. Hadoop概念学习系列之hadoop生态系统闲谈(二十五)
  7. 安卓开发错误:The type android.support.v4.app.TaskStackBuilder$SupportParentable cannot be resolved.
  8. (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法
  9. MVC(Model View Controller)框架
  10. struts2 <s:iterator/>怎样取得循环的索引
  11. Elastarchsearch安装搭建(一)
  12. JS数组处理
  13. 编译安装nginx却requires the PCRE library
  14. ArrayListd的长度问题
  15. python 去除html 超链接href 如何实现?
  16. webpack4.0各个击破(10)—— Integration篇
  17. Redis 的 8 大应用场景!
  18. UX求职:FB和微软这些大佬公司看重的UX设计师技能,你还差几条?
  19. FreeMarker 处理不存在的变量
  20. 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)

热门文章

  1. 主线程 RunLoop 学习笔记
  2. meterpreter 持久后门
  3. Windows 10 关闭Hyper-V
  4. python __str__() 和 __repr__()是干啥的
  5. Linux SPI初始化及接口函数代码细究
  6. composer安装doctrine/dbal
  7. Linux网络属性管理
  8. spring-petclinic性能调优实战(转)
  9. 【读书笔记】使用JMeter创建数据库(Mysql)测试
  10. 复旦大学2017--2018学年第二学期高等代数II期末考试情况分析