django的CBV设计模式
2024-10-20 03:38:14
一、什么的是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)
源码分析
最新文章
- 23种设计模式--单例模式-Singleton
- Socket通信基本原理
- 状态压缩 HDU1074
- IOS 遍历未知对象的属性和方法
- 深入SQL截取字符串(substring与patindex)的详解
- Hadoop概念学习系列之hadoop生态系统闲谈(二十五)
- 安卓开发错误:The type android.support.v4.app.TaskStackBuilder$SupportParentable cannot be resolved.
- (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法
- MVC(Model View Controller)框架
- struts2 <;s:iterator/>;怎样取得循环的索引
- Elastarchsearch安装搭建(一)
- JS数组处理
- 编译安装nginx却requires the PCRE library
- ArrayListd的长度问题
- python 去除html 超链接href 如何实现?
- webpack4.0各个击破(10)—— Integration篇
- Redis 的 8 大应用场景!
- UX求职:FB和微软这些大佬公司看重的UX设计师技能,你还差几条?
- FreeMarker 处理不存在的变量
- 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)
热门文章
- 主线程 RunLoop 学习笔记
- meterpreter 持久后门
- Windows 10 关闭Hyper-V
- python __str__() 和 __repr__()是干啥的
- Linux SPI初始化及接口函数代码细究
- composer安装doctrine/dbal
- Linux网络属性管理
- spring-petclinic性能调优实战(转)
- 【读书笔记】使用JMeter创建数据库(Mysql)测试
- 复旦大学2017--2018学年第二学期高等代数II期末考试情况分析