21 django之FBV与CBV
一、FBV与CBV
1.FBV 基于函数的视图
def index(request): return HttpResponse(...)
2.CBV 基于类的视图——CBV会自动判断当前请求方法并自动匹配类中的方法执行
# 视图函数即可以是函数也可以是类 from django.views import View class MyLogin(View): def get(self, request): return HttpResponse('get请求') def post(self, request): return HttpResponse('post请求') url(r'^login/', views.MyLogin.as_view()) """CBV会自动判断当前请求方法并自动匹配类中的方法执行"""
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), #FBV url(r"^index/",views.index), #CBV url(r"^login/",views.MyLogin.as_view()) ]
为何能够做到自动匹配并执行??
二、CBV源码剖析
函数名或者方法名遇到括号执行优先级最高
对象查找属性或方法的顺序
永远都是先从自己身上找
然后去产生对象的类中找
再去类的父类中找 如果都没有才会报错
闭包函数
定义在函数内部并且使用了外层函数名称空间中的名字
回去记得复习面向对象反射
FBV与CBV在路由匹配上本质其实是一样的
都是正则表达式对应函数名
温故知新:getattr通过字符串的形式获取对象的属性或方法
口头表述CBV底层逻辑
1. url(r"^login/",views.MyLogin.as_view()) as_view())里定义了一个view函数 2.view里面调用了一个self.dispatch 3.利用反射获取当前的方法,去类里面找有没有跟方法相同的方法名 4.找到了执行
FBV与CBV在路由匹配上本质其实是一样的 都是正则表达式对应函数名 url(r'^login/', views.MyLogin.as_view()) def as_view(cls, **initkwargs): def view(request, *args, **kwargs): # cls使我们自定义的类 MyLogin self = cls(**initkwargs) # 产生一个MyLogin类的对象 obj return self.dispatch(request, *args, **kwargs) return view 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)