一:CBV介绍
FBV-----function based view 基于函数的视图
CBV-----class based view 基于类的视图
二:登录案例
1:案例
(1)前端页面
<body> <form action=""method="post"> {% csrf_token %} <input type="text" name="user"> <input type="password" name="pwd"> <input type="submit" > </form> </body>
(2)后端代码
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.LoginView.as_view()), ]
from django.shortcuts import render,HttpResponse from django.views import View class LoginView(View): def get(self,request): return render(request,"login.html") def post(self,request): return HttpResponse("ok") def delete(self,request): pass def put(self,request): pass

点击提交-----post请求---页面显示ok
为什么get请求走get方法?=====》看源码
三:以登录案例为例来分析源码
我们先看:
path('login/', views.login), #views.login 返回一个函数对象====》一旦login/匹配成功,执行这个函数对象
======对比=======
path('login/', views.LoginView.as_view()), #LoginView.as_view()类。方法==============》views.LoginView.as_view()一定也会返回一个函数对象===》我们只需要看返回的到底是不是函数对象
我们去View类中找as_view()

关键代码:(为什么我们访问就能之间进get、post方法呢?)
path('login/', View.as_view.view) # 用户访问get请求/login/-----------view(request) --------------------------------------------- def view(request): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs) --------------------------------------------------------- def dispatch(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) #反射找get\post\put方法

补充:
(1)改写

实际上CBV模式就是基于反射 实现根据请求方式不同,执行不同的方法
(2)


(3)

from django.views import View class LoginView(View): def dispatch(self, request, *args, **kwargs): print("==========") super().dispatch(request, *args, **kwargs) def get(self,request): return render(request,"login.html")
注意这样会报错的,因为没有返回值
浙公网安备 33010602011771号