一、FBV(函数视图)

  1. FBV 基于函数的视图
  2. def index(request):
  3. return HttpResponse(...)
  4. 前几章我写的views.py内容都是FBV函数视图

二、CBV(类的视图)

  1. CBV 基于类的视图
  2. """
  3. 视图函数即可以是函数也可以是类
  4. 前后端分离使用CBV较多,后面的drf用得都是CBV
  5. """
  6. ------------------"views.py"---------------------
  7. from django.views import View
  8. class MyLogin(View):
  9. def get(self, request):
  10. return HttpResponse('get请求')
  11. def post(self, request):
  12. return HttpResponse('post请求')
  13. --------------------"urls.py"------------------
  14. url(r'^login/', views.MyLogin.as_view())
  15. """CBV会自动判断当前请求方法并自动匹配类中的方法执行"""

课间思考:为何能够做到自动匹配并执行

三、CBV源码剖析

  1. """
  2. 函数名或者方法名遇到括号执行优先级最高
  3. 对象查找属性或方法的顺序
  4. 永远都是先从自己身上找
  5. 然后去产生对象的类中找
  6. 再去类的父类中找 如果都没有才会报错
  7. 闭包函数
  8. 定义在函数内部并且使用了外层函数名称空间中的名字
  9. 回去记得复习面向对象反射
  10. """
  11. FBVCBV在路由匹配上本质其实是一样的
  12. 都是正则表达式对应函数名
  13. url(r'^login/', views.MyLogin.as_view())
  14. def as_view(cls, **initkwargs):
  15. def view(request, *args, **kwargs):
  16. # cls使我们自定义的类 MyLogin
  17. self = cls(**initkwargs) # 产生一个MyLogin类的对象 obj
  18. return self.dispatch(request, *args, **kwargs)
  19. return view
  20. def dispatch(self, request, *args, **kwargs):
  21. if request.method.lower() in self.http_method_names:
  22. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  23. else:
  24. handler = self.http_method_not_allowed
  25. return handler(request, *args, **kwargs)

CBV文字表述(必会):

  1. # 问:请求来了,对应的执行:
  2. --------------------------------------"urls.py"--------------------------------------
  3. from django.conf.urls import url
  4. from django.contrib import admin
  5. from app01 import views
  6. import sys
  7. print("sys.path",sys.path)
  8. urlpatterns = [
  9. url(r'^admin/', admin.site.urls),
  10. url(r'^index/', views.index),
  11. # CBV
  12. url(r"^login/",views.Mylogin.as_view())
  13. ]
  14. --------------------------------------"views.py"--------------------------------------
  15. from django.shortcuts import HttpResponse,render,redirect,reverse
  16. from django.view import View
  17. class Myclass(object):
  18. def get(self,request):
  19. return HttpResponse("GET请求")
  20. def post(self,request):
  21. return HttpResponse("POST请求")
  22. --------------------------------"过程文字表达"-------------------------------------
  23. 1、网页发来请求
  24. url(r"^home/",views.Myclass.as_view())的正则匹配项,匹配
  25. 2、执行第二个参数:views.Myclass.as_view()
  26. 3
  27. as_view函数定义了个闭包函数,生成了一个Myclass对象,返回了一个self.dispatch(),利用对象的反射获取到了请求的方法,去Myclass类内查看有没有这个请求的方法名,如果有,则执行,没有的话,web网页则显示405,不允许使用这种请求方法。