Django视图之FBV与CBV
一. CBV与FBV
CBV:Class Based View
FBV:Function Based View
我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的,那就是CBV。
下面我们就以前面所写的图书管理系统中的添加出版社为例:
FBV版本:
# 新增出版社
def add_publisher(request):
if request.method == "POST":
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
return render(request, "add_publisher.html")
CBV版本:
from django.views import View class AddPublisher(View):
def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
注意:使用CBV时,urls.py中也做对应的修改:
path('add_publisher/', views.AddPublisher.as_view()), # 新增出版社
二. 给视图加装饰器
1. 使用装饰器装饰FBV
FBV本身就是一个函数,所以和给普通的函数加装饰器无差:
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("used:", end_time - start_time)
return ret return inner # 新增出版社
@wrapper
def add_publisher(request):
if request.method == "POST":
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
return render(request, "add_publisher.html")
2. 使用装饰器装饰CBV
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
方式一:给某个方法加上装饰器(此例给get方法加上)
from django.views import View
from django.utils.decorators import method_decorator class AddPublisher(View): # CBV版
@method_decorator(wrapper)
def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
方式二:加在dispatch方法上面,会给类下的所有方法加上此装饰器
class AddPublisher(View): # CBV版
@method_decorator(wrapper)
def dispatch(self, request, *args, **kwargs):
obj = super(AddPublisher, self).dispatch(request, *args, **kwargs)
return obj def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
方式三:加在类上面
@method_decorator(wrapper, name="post")
@method_decorator(wrapper, name="get") # 给哪个方法加,就要指定name
class AddPublisher(View): # CBV版
def dispatch(self, request, *args, **kwargs):
obj = super(AddPublisher, self).dispatch(request, *args, **kwargs)
return obj def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
Django视图之FBV与CBV的更多相关文章
- django中的FBV和CBV
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...
- django中的FBV和CBV??
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...
- django基础之FBV与CBV,ajax序列化补充,Form表单
目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...
- Django 学习视图之FBV与CBV
一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...
- Django中的FBV与CBV
一. FBV FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数. 1.1 FBV代码示例 urls.py from django.contrib im ...
- django中视图处理请求方式(FBV、CBV)
FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...
- django中视图函数的FBV和CBV
1.什么是FBV和CBV FBV是指视图函数以普通函数的形式:CBV是指视图函数以类的方式. 2.普通FBV形式 def index(request): return HttpResponse('in ...
- django的FBV和CBV
title: python djano CBV FBV tags: python, djano, CBV, FBV grammar_cjkRuby: true --- python django的fu ...
- python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统
一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...
随机推荐
- 几台WEB经常宕机,求分析原因
几台WEB服务器经常宕机,平时运行得好好的,负载也都在2以下,偶尔会突然负高上去就宕机,init 6也无法重启成功 只能echo 'b'>/proc/sysrq-trigger 硬重启才行,dm ...
- ${filename}用法二:
假设:filename=/dir1/dir2/dir3/my.filename.txt 1.单一符号是最小匹配﹔两个符号是最大匹配. ${filename::}:提取最左边的5个字节:/dir1 ${ ...
- python脚本攻略之log日志
1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...
- 04 vue-cli 脚手架、webpack-simple模板项目生成、组件使用
alice https://www.cnblogs.com/alice-bj/p/9317504.html https://www.cnblogs.com/alice-bj/p/9318069.htm ...
- Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery
PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...
- [Mysql]过大sql文件导入过慢问题解决
控制 MySQL 磁盘写入策略 以及 数据安全性 的两个关键参数: innodb_flush_log_at_trx_commit 和 sync_binlog 参数:innodb_flush_log_a ...
- Ubuntu:19.04程序启动缓慢
造冰箱的大熊猫@cnblogs 2019/5/8 Ubuntu 19.04,程序(Firefox.Terminal.Nautilus)启动非常缓慢.点击桌面工具栏上的Nautilus图标后,隔了很久才 ...
- 上传base64图片至七牛云,并返回图片link
https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code
- nginx 入门实战
nginx入门实战 nginx 安装与卸载 下载安装 进入 http://nginx.org/en/download.html 下载自己想要的版本,我选择的stable版本 tar -zxvf ngi ...
- 灰度图像--图像增强 非锐化掩蔽 (Unsharpening Mask)
学习DIP第35天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...