zoukankan      html  css  js  c++  java
  • Django中的FBV与CBV

    一. FBV

    FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数.

    1.1 FBV代码示例

    urls.py

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/',views.login)
    ]

    views.py

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    def login(request):
        if request.method == "GET":
            return render(request,"login.html")
        else:
            if request.POST.get("user") == "afly" and request.POST.get("pwd") == "123":
                return HttpResponse("ok")
            return render(request, "login.html")

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="登录">
    </form>
    </body>
    </html>

    二. CBV

    CBV(class based views)  基于类的视图,即在视图里使用类处理请求.

    Python是一门面向对象的变成语言, 如果只用函数来开发, 有很多面向对象的优点就用不上了(继承, 多态, 封装). 所以Django在后来加入了Class-Based-View.

    可以让我们用类写View,这样做的优点主要下面两种 :

    1. 提高代码的复用性, 可以使用面向对象的技术, 例如: Mixin(多继承)
    2. 可以用不同的函数正对不同的HTTP方法处理, 而不是通过很多if判断, 提高代码可读性

    2.1 CBV代码示例

    urls.py

    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()),
    ]

    views.py

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from django.views import View
    class LoginView(View):
    
        def get(self,request):
            return render(request,"login.html")
    
        def post(self,request):
    
            print(request.POST.get("user"))
            print(request.POST.get("pwd"))
            return HttpResponse("OK")
    
        def delete(self,request):
    
            return HttpResponse("delete...")

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    
    <form action="" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit">
    </form>
    </body>
    </html>

    2.2 CBV的请求流程及View源码解读

    1.假如有用户以get请求访问login, views.py下的LoginView会执行as_view()

    2.但是LoginView类没有as_view()方法, 于是去他的父类View中查找.

    3.他的父类View有此方法, as_view()中的view被执行: 

    def view(request):
                  
        return self.dispatch(request, *args, **kwargs)

    4.view中对LoginView实例化成了self,又调用了dispatch

        def dispatch(self, 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)

    5.dispatch通过反射来判断LoginView是否有该请求方式的方法, 最后将该方法的执行结果返回

  • 相关阅读:
    解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错
    jackson @ResponseBody 处理日期类型的字段
    spring 中 InitializingBean 接口使用理解
    idea 中如何生成类图
    阿里云centOS 重启后 重启应用步骤
    日期类型 通过JOSN.stringify 后时间倒退8小时问题
    centOS7 下 安装mysql8.x
    Linux下卸载mysql8.x版本
    服务器上 MySql 8.0.16创建远程连接账号、获取初始密码、修改密码、重启命令等
    vue中读取excel中数据
  • 原文地址:https://www.cnblogs.com/af1y/p/10492832.html
Copyright © 2011-2022 走看看