django的类视图-11
使用函数方式定义的视图叫函数视图,虽然使用方便,便于理解,但是当一个s视图有多种请求方式的时候,变需要使用分支来编写不同请求方式对应的逻辑。
使用函数视图,代码看上去是这样子的
def my_view(request):
if request.method == 'GET':
return HttpResponse("get")
if request.method == 'POST':
return HttpResponse("post")
1. 使用类视图
基于类的视图的核心是允许你用不同的实例方法来响应不同的HTTP请求方法,而不是在一个视图函数中使用条件分支代码来实现。
创建类视图
使用类视图,代码是这样子的
from django.views import View
class ClassView(View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
类视图需要继承django提供的 View
类,使用 from django.views import View
导入
注册路由
配置类视图的时候,使用类视图的 as_view
方法注册路由
urlpatterns = [
url(r'^class_view', views.ClassView.as_view(), name="class_view")
]
as_view
会返回类中一个方法的引用,它会到 View
中,执行 dispatch
方法, dispatch
会方法会在类中查找类似GET\POST之类的类方法,然后和请求方式进行匹配,匹配上了,就返回该方法的引用。
如果向上边的类视图发送一个 GET
请求,他会把 GET
转换为小写形式并和类中的方法进行匹配,然后匹配到 get
方法,会把 get
方法的引用返回到 as_view
调用处。所以在 get
请求下最后 as_view
是 get
方法的引用。
类视图使用装饰器
可以使用装饰器为类视图增加功能,使用装饰器有三种方式。
- 在url配置中装饰
- 在类视图中装饰
- 使用Mixin扩展类
为了便于理解,使用下边的案例做演示
def decorator(func):
def wrapper(request, *args, **kwargs):
print('装饰器被调用')
return func(request, *args, **kwargs)
return wrapper
class ClassView(View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
在url中装饰
url(r'^class_view', views.decorator(views.ClassView.as_view()), name="class_view")
发送 GET
或者 POST
类型请求打印结果
装饰器被调用
在url中调用该函数,并把 as_view
方法传入即可,这种方式会把所有被请求的函数都进行装饰。
这种方法把装饰放到了url配置中,不利于代码的完整性和可读性,所以一般情况下不使用。
在类视图中装饰
在类视图中使用装饰器不能直接装饰,需要使用 method_decorator
把装饰器转换位适用于类的装饰器。
在我们写的装饰器中,内层函数接收的参数为 request
def decorator(func):
def wrapper(request, *args, **kwargs):
print('装饰器被调用')
return func(request, *args, **kwargs)
return wrapper
而在类视图的方法中,第一个参数是 self
,所以要使用 method_decorator
把装饰器的第一个参数补充为 self
以使用类视图中的方法。
也可以手动为装饰器添加参数 self
def decorator(func):
def wrapper(self, request, *args, **kwargs):
print('装饰器被调用')
return func(self, request, *args, **kwargs)
return wrapper
装饰所有方法
可以重写并装饰类的 dispatch
方法,代码如下
class ClassView(View):
@method_decorator(decorator)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
使用 GET
或者 POST
方式请求,都会执行装饰器,打印结果
装饰器被调用
只装饰某一个方法
class ClassView(View):
@method_decorator(decorator)
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
只有使用 GET
方式请求,才会执行装饰器,打印结果
装饰器被调用
POST
方式不会执行装饰器。
method_decorator 的 name 参数
装饰全部方法
@method_decorator(decorator, name="dispatch")
class ClassView(View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
指定被装饰的方法
@method_decorator(decorator, name="get")
class ClassView(View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
使用Mixin扩展类
扩展类使用了 Python 多继承的 MRO
特性。
class MyMixin(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = decorator(view)
return view
class ClassView(MyMixin, View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
这种方式会装饰所有方法,可以使用这种方式为方法添加多个装饰器。
django的类视图-11的更多相关文章
- 在DJANGO的类视图中实现登陆要求和权限保护
以前接触的是基于函数的保护,网上材料比较多. 但基于类视图的很少. 补上! Decorating class-based views 装饰类视图 对于类视图的扩展并不局限于使用mixin.你也可以使用 ...
- Part 4:表单和类视图--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- 六、Django之表单和类视图-Part 4
一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...
- django类视图简单使用和源码解析
django的类视图,CBV: 我们在开始接触django的时候,习惯于使用函数编写视图,即FBV.使用FBV时,我们只需要在路由匹配时,对应的路由下找到这个函数就可以了,这样做看似很和谐,但是有的时 ...
- django中的类视图
# 原创,转载请留言联系 当我们在开发一个注册模块时.浏览器会通过get请求让注册表单弹出来,然后用户输完注册信息后,通过post请求向服务端提交信息.这时候我们后端有两个视图函数,一个处理get请求 ...
- 补充01 Django 类视图
视图 函数视图[Function Base View] 以函数的方式定义的视图称为函数视图,函数视图便于理解.但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不 ...
- django 类视图的使用
使用django框架也有挺长时间了,但是一直都没有用过django的类视图,因为之前跟着网上教程学习时,觉得类视图是进阶的知识,可能目前还达不到吧 但今天在做项目的时候用到了,感觉真的太方便了吧,而且 ...
- 第 4 篇:用类视图实现首页 API
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 django-rest-framework 类视图拓展自 django 的类视图,只 ...
- Django内置的通用类视图
1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...
随机推荐
- App 图标设计 - 圆角透明效果(0 基础使用 PS)
App 图标设计 - 圆角透明效果(0 基础使用 PS) 方法: 如果你有些基础,就不必看图文教程了: 1.使用圆角矩形工具选中,设置圆角尺寸[例如:1024*1024 px(圆角:160 px)] ...
- zabbix系列之六——安装后配置二Items
https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/snmp 1Items 1.1creating items ...
- windows 2008 r2 安装 owas 2013
windows 2008 r2 安装 owas 2013 1.NDP452-KB2901907-x86-x64-AllOS-ENU 2.Add-WindowsFeature Web-Server,W ...
- javascript event visualize
很多时候拿到一个spa,特别是基于jquery的比较复杂的spa时,如果你好奇他是如何工作的,往往没有头绪. 由于spa基本上都是基于事件触发的,一个可行的办法是通过查看事件处理代码能够对spa有一个 ...
- HDFS pipeline写 -- datanode
站在DataNode的视角,看看pipeline写的流程,本文不分析客户端部分,从客户端写数据之前拿到了3个可写的block位置说起. 每个datanode会创建一个线程DataXceiverServ ...
- 在 Linux 上创建虚拟机规模集和部署高度可用的应用
利用虚拟机规模集,可以部署和管理一组相同的.自动缩放的虚拟机. 可以手动缩放规模集中的 VM 数,也可以定义规则,以便根据资源使用情况(如 CPU 使用率.内存需求或网络流量)进行自动缩放. 在本教程 ...
- etcd 分布式数据库概念初探
Lease(租约): 其实就是一个定时器.首先申请一个TTL=N的lease(定时器),然后创建key的时候传入该lease,那么就实现了一个定时的key. 在程序中可以定时为该lease续约,也就是 ...
- Linux系统管理员命令:sudo
sudo是个统管一切的命令.它的字面意思是代表“超级用户才能做!”(super user do!)对Linux系统管理员或高级用户而言,它是必不可少的最重要的命令之一.你可曾有过这样的经历:在终端中试 ...
- 第一个 mac 程序 Create-JSON-Model
第一个 mac 程序 Create-JSON-Model 效果图 数据 {"ID":null,"name":"Doe","firs ...
- PowerShell管理SCOM_批量设置维护模式(上 )
#定义存储需要置为维护模式的计算机名称列表 $serverlist = "C:\scomm\servers.txt" #定义脚本执行结果的输出位置 $server_maintena ...