• django:cbv模式和fbv模式的区别


    cbv(class base view)模式是用面向对象的方式去写的,fbv(function base view)是用面向过程的方式去写的。下面以登录接口作为例子做比较:

    共同的html页面如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>登陆接口</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
    <h3 align="center">登录页面</h3>
    <p align="center">{{ new_time }}</p>
    <form action="" method="post">
           <table  align="center">
              <tr>
                 <td>用户名</td>
    
                 <td>
                    <input type="text" name="username" />
                </td>
              </tr>
              <tr>
                 <td>密码</td>
                 <td>
                    <input type="text" name="password"/>
                </td>
               <p style="color: red" align="center">
                    {{msg}}
              </p>
              <tr>
                 <td>
                    <input type="submit" value="登录">
                 </td>
    
              </tr>
            </table>
    </form>
    </body>
    </html>

    cbv模式:

    编写的view视图如下:自定义的类需要继承View父类

    from django.views import View
    
    class CbvLogin(View):
        '''CBV模式'''
        def get(self,request):
            return render(request,"login.html",context={"new_time": new_time})
    
        def post(self,request):
            username = request.POST.get("username")
            password = request.POST.get("password")
            print("用户名:{},密码:{}".format(username, password))
            #  todo user认证成功返回对象,认证失败返回空
            user = authenticate(username=username,
                                password=password)
            if user:
                if user.is_active:  # 判断用户是否有效,获取表里面的is_active这个属性
                    login(request, user=user)  # 登录,user对象里面包含用户名和密码
                    request.session["user"] = username  # 加session
                    request.session.set_expiry(None)  # 设置session有效期:0为关闭浏览器马上失效,none为永久
                    result = {"code": 0,
                              "msg": "login success!",
                              "data": {"username": username,
                                       "password": password,
                                       }
                              }
                    return HttpResponseRedirect("/info/")
    
            else:
                return render(request, "login.html", context={"msg": "用户名或密码错误"})

    urls路由配置:

    如图:需要加as_view()

    fbv模式:

    编写的view视图如下:

    def login_auth(request):
        if request.method == "GET":
            return render(request, "login.html", context={"new_time": new_time})
        if request.method == "POST":
            username = request.POST.get("username")
            password = request.POST.get("password")
            print("用户名:{},密码:{}".format(username, password))
            #  todo user认证成功返回对象,认证失败返回空
            user = authenticate(username=username,
                                password=password)
            if user:
                if user.is_active:  # 判断用户是否有效,获取表里面的is_active这个属性
                    login(request, user=user)  # 登录,user对象里面包含用户名和密码
                    request.session["user"] = username  # 加session
                    request.session.set_expiry(None)  # 设置session有效期:0为关闭浏览器马上失效,none为永久
                    result = {"code": 0,
                              "msg": "login success!",
                              "data": {"username": username,
                                       "password": password,
                                       }
                              }
                    # return JsonResponse(result)
                    return HttpResponseRedirect("/info/")
            # if user:
            #     if user.is_active:
            #         response = HttpResponseRedirect("/info/")   # 设置cookie信息,名字是user,值是123456
            #         response.set_cookie("user",password)       # todo 设置cookie
            #         return response
    
    
            else:
                return render(request, "login.html", context={"msg": "用户名或密码错误"})

    urls路由配置:

    如图:

    总结:

    语法上cbv定义类必须需要继承View父类,urls路由配置cbv需要加as_view()。而fbv则不需要这些。

    模式:一个面向对象的写法,一个面向过程。

  • 相关阅读:
    Android MVP框架实现过程
    bga-banner-引导页滑动第三方控件
    好的习惯是成功的一半之开发
    Java基础复习之String字符串format处理
    ButterKnife--View注入框架的使用
    div阴影
    JavaScript函数的4种调用方法详解
    JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()
    HTML文字闪烁
    HTML文本框样式大全
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/12601815.html
Copyright © 2020-2023  润新知