django 视图 分为两种:
1. FBV 基于函数的视图 function based view
2. CBV 基于类的视图 class based view
基于类的视图
CBV :基于 类的视图函数
1、后端逻辑处理时不用通过逻辑,来判断请求方式是get还是post请求
在视图类中,定义了get方法就是写get请求的逻辑,定义类post方法时
就是post请求逻辑。
2、View 的源码分析过程
1.先从url.py 文件的开始分析入手:
1 from app01 import views 2 3 urlpatterns = [ 4 path('admin/', admin.site.urls), 5 6 path('login/', views.LoginView.as_view()), # CBV 基于类的视图 7 path('index/', views.index), # FBV 基于函数的视图 8 ] 9 10 1. #views.LoginView.as_view() 必须是一个视图函数
2. 点击进入源码
View 大致执行流程:
self.as_view() =====> self.dispatch() ====> self.get/post/等
# 路由分发开始 获取具体的请求方面名,在通过反射具体的请求函数 视图函数
1 class View: 2 3 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 4 5 6 def as_view(cls, **initkwargs): 7 8 def view(request, *args, **kwargs): 9 10 11 return self.dispatch(request, *args, **kwargs)
return view 12 13 14 def dispatch(self, request, *args, **kwargs): 15 16 # self.http_method_names=['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 17 18 if request.method.lower() in self.http_method_names: 19 # 用反射 获取函数 request.method.lower() # 为 get 20 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) 21 # hander=getattr(self,"get") # 相当于执行了 该类下的get方法 22 else: 23 handler = self.http_method_not_allowed 24 25 #handler(request, *args, **kwargs) ====> get(request,*args, **kwargs) 26 27 return handler(request, *args, **kwargs) # 相当于类下的 执行 return self.get(request,)
3. 在view.py 文件中:
1 from django.view import View 2 3 # CBV 基于类的视图 4 class LoginView(View): 5 6 def get(self,request,*args, **kwargs): 7 8 9 return render(request,"login.html") 10 11 def post(self,request,*args, **kwargs): 12 13 return redirect('/index/') 14 15 16 # FBV 基于函数的视图 17 def index(request): 18 19 return render(request,"index.html")