一、FBV(函数视图)
FBV 基于函数的视图
def index(request):
return HttpResponse(...)
前几章我写的views.py内容都是FBV函数视图
二、CBV(类的视图)
CBV 基于类的视图
"""
视图函数即可以是函数也可以是类
前后端分离使用CBV较多,后面的drf用得都是CBV
"""
------------------"views.py"---------------------
from django.views import View
class 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使我们自定义的类 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)
CBV文字表述(必会):
# 问:请求来了,对应的执行:
--------------------------------------"urls.py"--------------------------------------
from django.conf.urls import url
from django.contrib import admin
from app01 import views
import sys
print("sys.path",sys.path)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
# CBV
url(r"^login/",views.Mylogin.as_view())
]
--------------------------------------"views.py"--------------------------------------
from django.shortcuts import HttpResponse,render,redirect,reverse
from django.view import View
class 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,不允许使用这种请求方法。