一. CBV与FBV

CBV:Class Based View

FBV:Function Based View

我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的,那就是CBV。

下面我们就拿添加用户为例:

1.FBV版本

首先:urls.py 的与视图关系编写为:path('register/', views.register),

然后是视图函数的内容:

from django.contrib.auth.models import User

from django.shortcuts import render, HttpResponse, redirect

# 注册及验证 (前端模板是以ajax实现)

def register(request):

if request.method == "GET":

return render(request, "register.html")

if request.method == "POST":

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)  # User是以个对象

return redirect("/index/")

2.CBV版本

首先:urls.py 的与视图关系编写为:path('register/', views.Register.as_view()),

然后是视图函数类编写的内容:

from django.views import View

class Register(View):

def get(self, request):

return render(request, "register.html")

def post(self, request):

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)

# User是以个对象

return redirect("/index/")

二. 给视图加装饰器

1. 使用装饰器装饰FBV

FBV本身就是一个函数,所以和给普通的函数加装饰器无差:

# 一个时间的装饰器来验证是否运行了装饰器

def wrapper(func):

def inner(*args, **kwargs):

start_time = time.time()

time.sleep(2)

ret = func(*args, **kwargs)

end_time = time.time()

print("used:", end_time - start_time)

return ret

return inner

@wrapper

def register(request):

if request.method == "GET":

return render(request, "register.html")

if request.method == "POST":

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)  # User是以个对象

return redirect("/index/")

访问的时候大概停留两秒再进行访问。并在后台打印出运行后的时间。

2.使用装饰器装饰CBV

类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。

使用之前需要先导入相应的包

from django.views import View

from django.utils.decorators import method_decorator

方式一:给某个方法加上装饰器(此例给get方法加上)

class Register(View):

@method_decorator(wrapper)

def get(self, request):

return render(request, "register.html")

def post(self, request):

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)

# User是以个对象

return redirect("/index/")

方式二:加在dispatch方法上面,会给类下的所有方法加上此装饰器

class Register(View):

# 加在dispatch方法上面,会给类下的所有方法加上此装饰器

@method_decorator(wrapper)

def dispatch(self, request, *args, **kwargs):

#这样的写法兼容python2*

obj = super(Register, self).dispatch(request, *args, **kwargs)

# python3写法如下(此方法不兼容python2*)

# obj = super().dispatch(request, *args, **kwargs)

return obj

def get(self, request):

return render(request, "register.html")

def post(self, request):

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)

# User是以个对象

return redirect("/index/")

此方式会给类下的所有方法加上此装饰器,也就是在这个注册过程运行了两次的装饰器,一次GET方法访问网页,一次POST方法注册。

方式三:加在类上面

@method_decorator(wrapper, name="post")

@method_decorator(wrapper, name="get")  # 给哪个方法加,就要指定name

class Register(View):

def get(self, request):

return render(request, "register.html")

def post(self, request):

username = request.POST.get("username")

password = request.POST.get("pwd")

print(username)

print(password)

User.objects.create_user(username=username, password=password)  # User是以个对象

return redirect("/index/")

上面加装饰器的方法是有固定格式的:

@method_decorator(装饰器名, name="类中需要装饰器的函数")

可以从源码中看出格式固定如截图:

补充:

以上的例子均可以使用下面的前端模板register.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body> <div class="container">
<div class="row con"> <form action="" method="post">
{% csrf_token %}
<div class="form-group col-sm-4 col-sm-offset-4">
<h2>注册用户</h2>
<label for="exampleInputEmail1">用户名</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="用户名" name="username">
</div>
<div class="form-group col-sm-4 col-sm-offset-4">
<label for="exampleInputPassword1">密码</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="密码" name="pwd">
</div>
<div class="form-group col-sm-6 col-sm-offset-3">
<button type="submit" class="btn btn-default col-sm-offset-2">确认</button>
<button type="submit" class="btn btn-default col-sm-offset-2">返回</button> </div> </form> </div>
</div>
</body>
</html>

register.html

Django 学习视图之FBV与CBV的更多相关文章

  1. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  2. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  3. Django - 自定义分页、FBV和CBV

    一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...

  4. Django【进阶】FBV 和 CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py 1 2 3 4 5 6 7 ...

  5. Django视图之FBV与CBV

    一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...

  6. Django生命周期,FBV,CBV

    一. Django生命周期 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串,在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中.Django的请求生命周 ...

  7. [Django学习]视图

    视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图: 1. UR ...

  8. django学习-视图练习

    写一个真正有用的视图 每个视图必须要做的只有两件事: 返回一个包含被请求页面内容的HttpResponse对象,或抛出一个异常,比如Http404. 至于你还想干些什么,随便你. 你的视图可以从数据库 ...

  9. django中视图处理请求方式(FBV、CBV)

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...

随机推荐

  1. VS常用快捷键(2012)

    Ctrl+K,D ----格式化全部代码 Ctrl+K,F ----格式化选中的代码 Ctrl+K,C ----注释选定内容 Ctrl+K,U ----取消注释选定内容 Ctrl+J或者 Ctrl+S ...

  2. Netty Learning Notes

    简介 Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端. ...

  3. Linux动态库路径配置

    参考链接:https://blog.csdn.net/blade2001/article/details/32839937 为什么要关注动态库路径配置,是因为工作中遇到动态库依赖其他动态库,而其他动态 ...

  4. Mysql架构、复制类型、复制功能介绍

    1.1 常见的几种主从架构 一主一从 一主多从 多主一从 双主互备 1.2 主从复制功能 1)实时灾备 2)读写分离 3)高可用 4)从库数据统计 5)从库数据备份 6)平滑升级 1.3 三种复制方式 ...

  5. 创建jsp文件时报错,"javax.servlet.http.HttpServlet" was not found on the Java)

    原因: 创建jsp文件的步骤如下: 出现"javax.servlet.http.HttpServlet" was not found on the Java) 报错信息就是因为没有 ...

  6. 【笔记3-用户模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    数据表结构设计 关系设计 为什么不用外键? 分库分表有外键会非常麻烦,清洗数据也很麻烦.数据库内置触发器也不适合采用. 查业务问题的后悔药--时间戳 create_time 数据创建时间 update ...

  7. 基于MACVLAN配置VMWARE虚拟机中容器网络

    基于MACVLAN配置VMWARE虚拟机中容器网络 测试部环境组 201711 0 文档说明 MACVLAN是docker的一种支持跨主机网络的driver.macvlan本身是linux kerne ...

  8. WLC Crash采集什么信息?

    WLC和思科的路由器交换机不同,Cisco的WLC采用的是AireOS. 如果WLC crash或无故重启,可以尝试采集如下信息: AireOS WLC version 8.0.140.0 or hi ...

  9. Nexus-vPC理论

    vPC:virtual Port-channel 1.vPC的作用: • 允许一个设备使用2个上游的设备的端口来实现Port Channel    • 消除STP阻止端口的情况    • 提供一个无环 ...

  10. 小程序云函数调用http或https请求外部数据

    参考网址 https://blog.csdn.net/qiushi_1990/article/details/101220920 小程序云函数调用http或https请求外部数据 原创编程小石头 发布 ...