一、FBV(函数视图)
FBV 基于函数的视图def index(request):return HttpResponse(...)前几章我写的views.py内容都是FBV函数视图
二、CBV(类的视图)
CBV 基于类的视图"""视图函数即可以是函数也可以是类前后端分离使用CBV较多,后面的drf用得都是CBV"""------------------"views.py"---------------------from django.views import Viewclass MyLogin(View):def get(self, request):return HttpResponse('get请求')def post(self, request):return HttpResponse('post请求')--------------------"urls.py"------------------url(r'^login/', views.MyLogin.as_view())"""CBV会自动判断当前请求方法并自动匹配类中的方法执行"""
课间思考:为何能够做到自动匹配并执行
三、CBV源码剖析
"""函数名或者方法名遇到括号执行优先级最高对象查找属性或方法的顺序永远都是先从自己身上找然后去产生对象的类中找再去类的父类中找 如果都没有才会报错闭包函数定义在函数内部并且使用了外层函数名称空间中的名字回去记得复习面向对象反射"""FBV与CBV在路由匹配上本质其实是一样的都是正则表达式对应函数名url(r'^login/', views.MyLogin.as_view())def as_view(cls, **initkwargs):def view(request, *args, **kwargs):# cls使我们自定义的类 MyLoginself = cls(**initkwargs) # 产生一个MyLogin类的对象 objreturn self.dispatch(request, *args, **kwargs)return viewdef 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_allowedreturn handler(request, *args, **kwargs)
CBV文字表述(必会):
# 问:请求来了,对应的执行:--------------------------------------"urls.py"--------------------------------------from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsimport sysprint("sys.path",sys.path)urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),# CBVurl(r"^login/",views.Mylogin.as_view())]--------------------------------------"views.py"--------------------------------------from django.shortcuts import HttpResponse,render,redirect,reversefrom django.view import Viewclass Myclass(object):def get(self,request):return HttpResponse("GET请求")def post(self,request):return HttpResponse("POST请求")--------------------------------"过程文字表达"-------------------------------------1、网页发来请求与url(r"^home/",views.Myclass.as_view())的正则匹配项,匹配2、执行第二个参数:views.Myclass.as_view()3、as_view函数定义了个闭包函数,生成了一个Myclass对象,返回了一个self.dispatch(),利用对象的反射获取到了请求的方法,去Myclass类内查看有没有这个请求的方法名,如果有,则执行,没有的话,web网页则显示405,不允许使用这种请求方法。
