FBV-----function based view 基于函数的视图
CBV-----class based view 基于类的视图html
<body> <form action=""method="post"> {% csrf_token %} <input type="text" name="user"> <input type="password" name="pwd"> <input type="submit" > </form> </body>
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方法?=====》看源码django
咱们先看:后端
path('login/', views.login), #views.login 返回一个函数对象====》一旦login/匹配成功,执行这个函数对象
======对比=======
path('login/', views.LoginView.as_view()), #LoginView.as_view()类。方法==============》views.LoginView.as_view()必定也会返回一个函数对象===》咱们只须要看返回的究竟是不是函数对象
咱们去View类中找as_view()app
关键代码:(为何咱们访问就能之间进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方法
补充:post
(1)改写url
实际上CBV模式就是基于反射 实现根据请求方式不一样,执行不一样的方法spa
(2)3d
(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")注意这样会报错的,由于没有返回值