zoukankan      html  css  js  c++  java
  • 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则不需要这些。

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

  • 相关阅读:
    JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)
    eval绑定decimal数据后,如何去掉后面没有意义的0?
    Linq使用Group By经验总结
    mysql 分页存储过程 一次返回两个记录集(行的条数,以及行记录),DataReader的Read方法和NextResult方法
    把 HttpHandler.ashx 修改为 异步编程 异步操作
    td内容自动换行 ,td超过宽度显示点点点… , td 使用 overflow:hidden 无效,英文 数字 不换行 撑破div容器
    window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应
    C#怎么调用百度地图Web API
    .Net MVC 当前上下文中不存在名称“Style”
    无法使用备份文件 'D:20160512.bak',因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4096
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/12601815.html
Copyright © 2011-2022 走看看