Django--CBV模式的视图函数--介绍&源码

一:CBV介绍

  FBV-----function based view    基于函数的视图
  CBV-----class based view       基于类的视图html

  

二:登陆案例

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方法?=====》看源码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")注意这样会报错的,由于没有返回值
相关文章
相关标签/搜索