django系列3.3--CBV 和 FBV
一.CBV和FBV
FBV function base views 用函数方法来处理请求
from django.http import HttpResponsedef my_view(request):if request.method == 'GET':return HttpResponse('OK')CBV class base views 用类来处理请求(面向对象)from django.http import HttpResponsefrom django.views import Viewclass MyView(View):def get(self, request):return HttpResponse('OK')
CBV class base views 用类来处理请求(面向对象)
views.py
from django.http import HttpResponsefrom django.views import Viewclass MyView(View):def get(self, request):return HttpResponse('OK')
urls.py
from django.conf.urls import url
from myapp.views import MyView #引入我们在views.py里面创建的类urlpatterns = [url(r'^index/$', MyView.as_view()),
]
CBV传参,和FBV类似,有名分组,无名分组
第一种url写法:无名分组的
url(r'^cv/(\d{2})/', views.MyView.as_view(),name='cv'),
url(r'^cv/(?P<n>\d{2})/', views.MyView.as_view(name='xxx'),name='cv')
如果想给类的name属性赋值,前提你的MyView类里面必须有name属性(类属性,定义init方法来接受属性行不通,但是可以自行研究一下,看看如何行通,意义不大),并且之前类里面的name属性的值会被覆盖掉
类写法
class MyView(View):name = 'robertx'def get(self,request,n):print('get方法执行了')print('>>>',n)return render(request,'cvpost.html',{'name':self.name})def post(self,request,n):print('post方法被执行了')return HttpResponse('post')
第二种url写法: 也可以在url中指定类的属性(在url中设置类的属性Python)
urlpatterns = [url(r'^index/$', MyView.as_view(name="robertx")), # 类里面必须有name属性,并且会被传进来的这个属性值给覆盖掉
]
二.给视图函数加装饰器
写一个装饰器:
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 retreturn inner
1.使用装饰器装饰FBV
#添加班级@wrapperdef add_class(request):if request.method == "POST":class_name = request.POST.get("class_name")models.Classes.objects.create(name=class_name) return redirect("/class_list/")return render(request, "add_class.html")
2.使用装饰器装饰CBV
from django.views import Viewfrom django.utils.decorators import method_decoratorclass AddClass(View):@method_decorator(wrapper)def get(self, request):return render(request, "add_class.html")def post(self, request):class_name = request.POST.get("class_name")return redirect("/class_list/")
总体来说有三种方式:
from django.utils.decorators import method_decorator
from django.views import View@method_decorator(wrapper,name='get')#CBV版装饰器方式一
class BookList(View):@method_decorator(wrapper) #CBV版装饰器方式二def dispatch(self, request, *args, **kwargs):print('请求内容处理开始')res = super().dispatch(request, *args, **kwargs)print('处理结束')return resdef get(self,request):print('get内容')# all_books = models.Book.objects.all()return render(request,'login.html')@method_decorator(wrapper) #CBV版装饰器方式三def post(self,request):print('post内容')return redirect(reverse('book_list'))
3.dispatch() 分发的方式处理函数
请求过来之后会先执行dispatch()方法,如果需要批量对具体的请求处理方法.如get,post等做一些操作的时候,可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器一样
class Login(View): def dispatch(self, request, *args, **kwargs):print('before')obj = super(Login,self).dispatch(request, *args, **kwargs)print('after')return objdef get(self,request):return render(request,'login.html')def post(self,request):print(request.POST.get('user'))return HttpResponse('Login.post')
转载于:https://www.cnblogs.com/robertx/p/10466059.html
django系列3.3--CBV 和 FBV相关推荐
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
- Flask入门(4):CBV和FBV
目录 4.CBV和FBV 4.1 继承 views.View 4.2 继承 views.MethodView 4.CBV和FBV 前面的例子中,都是基于视图函数构建视图(FBV),和Django一样, ...
- 视图层详解,cbv和fbv,文件上传
day64 一.复习 二.视图层之请求对象 三.视图层之响应对象 补充知识之json序列化与反序列化 四.cbv和fbv 五.文件上传 六.postman软件 七.form表单,提交地址 八.Pych ...
- CBV与FBV的区别/CBV源码剖析
FBV与CBV # 针对于视图函数(views.py),视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写. 区别展示: login.html <h1>GET请求< ...
- Django系列目录
一:搭建自己的博客系列 搭建自己的博客(一):前期准备 搭建自己的博客(二):创建表,创建超级用户 搭建自己的博客(三):简单搭建首页和详情页 搭建自己的博客(四):优化首页和详情页 搭建自己的 ...
- django 默认查询条件_Python之Django系列-创建第一个应用-4
上一篇:Python之Django系列-创建第一个应用-3 上一篇文章我们介绍了创建项目,打开浏览器访问http://127.0.0.1:8000/polls/,能看见"投票主页视图&quo ...
- python 创建一个空向量_Python之Django系列-创建第一个应用-5
上一篇:Python之Django系列-创建第一个应用-4 这一章我们会讲到视图层怎么与数据库操作并返回数据到模板层进行渲染最终显示在页面上 投票应用基本上会有这么几个视图 问题列表页 问题详情页 问 ...
- Django 系列博客(十一)
Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...
- Django 系列博客(二)
Django 系列博客(二) 前言 今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳. 命令行搭建 Django 项目 创建纯净虚拟环境 在上一篇博客 ...
最新文章
- 安装node.js 附带node.js以及npm初步认识 设置淘宝/npm镜像 命令
- 移动端touchstart、touchmove事件的基本使用
- 深度解析JAVA动态代理设计模式
- python opencv 图像网络传输
- 重磅!深入调研证券行业,神策数据发布《财富管理数字化转型现状与趋势洞察》报告...
- 北京昌平计算机职业高中学校,北京职业学校2021中专
- 用单片机制作简单的频率计
- 激光slam_机器人主流定位技术,激光SLAM与视觉SLAM谁更胜一筹
- [ES6] 细化ES6之 -- 对象的扩展
- java实现一台电脑控制多台手机_涨姿势:教你用电脑远程控制多台手机!终于可以挂手机了!...
- 关于华为2019全联接大会,精华内容都在这里!
- (C++)整型数组A[n]中的元素调整为左右两部分,其中左边所有元素为奇数,右边所有元素为偶数。时间复杂度为O(n)。
- c#程序员和java薪酬_语言趋势和薪水:Java的未来之路
- 【安全知识分享】重磅|消防控制室培训.ppt(附下载)
- 多线程的实现和使用场景
- 学习Android studio 个人总结小经验
- 初识ecshop小京东(1)——认识路由
- 第二章 BIRT设计器概述及本地化支持
- slave是什么意思详细介绍
- 重要:关于PPT转图片需要注意的问题