Django Rest Framework----ModelViewSet视图 ModelViewSet源码分析
一、视图类
#bookview是一个视图类,继承自ModelViewSet
class BookView(ModelViewSet):
throttle_classes = [VisitThrottle2]
queryset = models.Book.objects.all()
serializer_class = BookModelSerializer
ModelViewSet
ModelViewSet:
class ModelViewSet(mixins.CreateModelMixin, # 实现了post添加逻辑
mixins.RetrieveModelMixin, # 实现了获取具体某一本书的逻辑
mixins.UpdateModelMixin, # 实现了put编辑的逻辑
mixins.DestroyModelMixin, # 实现了删除一本书的逻辑
mixins.ListModelMixin, # 实现了获取所有书的逻辑
GenericViewSet): # 提供了APIView和dispatch的功能
....
由于ModelViewSet继承了多个混合类和通用视图类,所以ModelViewSet提供了.list(),.retrieve(), .create(),.update(),.partial_update(),和.destroy()
因为ModelViewSet继承了GenericViewSet,所以BookView需要提供queryset和serializer_class属性
二、执行流程
1. url:
url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})),
url(r'books/(?P<pk>\d+)/$',views.BookDetailView.as_view({'get': 'retrieve',
'put':'update',
'delete':'destroy'})),
当django启动的时候,会执行view.BookView.as_view()方法:由于as_view()是从ViewSetMixin中继承而来的,所以url会变为:
url(r'books/$',ViewSetMixin.view),
url(r'books/(?P<pk>\d+)/$',ViewSetMixin.view),
2.当用户访问books/的时候,会调用执行ViewSetMixin.view并传入request。
class ViewSetMixin(object):
"""
他是一个魔法方法
重写`.as_view()‘,以便它接受一个’actions‘关键字,
该关键字执行HTTP方法到资源上的操作的绑定。
例如,要创建一个将“GET”和“POST”方法绑定到“List”和“Create”操作的具体视图.
view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
"""
def view(request, *args, **kwargs):
self = cls(**initkwargs)
self.action_map = actions # {'get':'list','post':'create'}
# {'get': 'retrieve','put':'update','delete':'destroy'} for method, action in actions.items():
# self:ModelViewSet继承的每一个类 action是list create等方法。
# handler是每一个具体的函数名
handler = getattr(self, action)
#为属性赋值, self.get = list, self.get = retrieve
# 当get请求的时候,真正会执行的是list/retrieve方法
setattr(self, method, handler) # 进行分发,由于以上几个类都没有实现该方法,所以dispatch()执行的是APIView的dispatch()
return self.dispatch(request, *args, **kwargs)
3.ViewSetMixin的view主要是把mixins中的list()、create()、retrieve()、等绑定给BookView的get()、post()等。
4.dispatch()
def dispatch(self, request, *args, **kwargs):
try:
self.initial(request, *args, **kwargs)
# get、put、post等请求方法,去list、create、update等,去执行
if request.method.lower() in self.http_method_names:
# 这里的self是ViewSetMixin。
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
response = handler(request, *args, **kwargs)
except Exception as exc:
response = self.handle_exception(exc)
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
当客户端请求方式是get的时候,执行BookView的get()方法,实际上是执行的list().因为在ViewSetMixin.view()中,获取minx下的list、create等函数地址,通过settattr()的方式绑给了BookView实例对象
三、总结:
django启动******
url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})), 1
url(r'books/$',ViewSetMixin.view)), 2
一旦用户访问******
books get请求
def view(request, *args, **kwargs):
self = cls(**initkwargs)
{'get':'list','post':'create'}
for method, action in actions.items():
handler = getattr(self, action)
#给BookView设置一个属性 BookView.get = ListModelMixin.list
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
url(r'books/$',APIView.dispatch)), 3
if get in self.http_method_names:
# 这里的self是ViewSetMixin。
handler = getattr(self, 'get'), --> BookView.get ---> 实际上执行的是 ListModelMixin.list
self.http_method_not_allowed)
handler返回什么,dispatch返回什么,view返回什么,用户看到什么
Django Rest Framework----ModelViewSet视图 ModelViewSet源码分析的更多相关文章
- Django rest framework 的认证流程(源码分析)
一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...
- django Rest Framework----GenericAPIView 通用视图 GenericAPIView源码分析
一.GenericAPIView GenericAPIView扩展了APIView,为标准列表和详细视图添加了常见的行为. 提供的每个具体通用视图都是一个GenericAPIView或多个mixin类 ...
- Django rest framework 限制访问频率(源码分析)
基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...
- Django_Restframwork_APIVIEW视图_源码分析
Django _VIEW视图_源码分析
- django Rest Framework----APIView 执行流程 APIView 源码分析
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...
- Django之admin的使用及源码分析
一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...
- Django(63)drf权限源码分析与自定义权限
前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...
- Django(64)频率认证源码分析与自定义频率认证
前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...
- Django day24 cbv和APIView的源码分析 和 resful的规范
一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View CBV(基于类的视图) - Function Base View FBV(基于函数的视图) 2.as_vi ...
- Django框架(十七)-- CBV源码分析、restful规范、restframework框架
一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...
随机推荐
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- 第三周 构造一个简单的Linux系统
20135331文艺 首先 在上周内容中我们学习了 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 本周中得知 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程 ...
- ELK5.4安装Xpack
X-Pack是一个Elastic Stack的扩展,将安全,警报,监控,报告和图形功能包含在一个易于安装的软件包中.在Elasticsearch 5.0.0之前,必须安装单独的Shield.Watch ...
- Java的I/O系统
1.File类 File类既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称. 如果我们调用不带参数的list()方法,便可以获得此File对象包含的全部列表.然而,如果我们想获得一个受限 ...
- 解题:USACO13FEB Taxi
题面 因为每次只能载一头牛,所以总路程=每头牛的距离+回头路的最短距离,于是问题变成了如何求回头路的最短距离 我们可以把起点和终点存在两个数组里,然后将两个数组排序后取对应位置相减的绝对值就是每次走回 ...
- JavaWeb中的多数据源开发
从我们接触Javaweb开始,ssh框架或者ssm等或许是惊叹于框架的强大之处还是自身的迷茫,一直没有注意到一个问题就是:在我的项目中在spring中所配置的数据源都是指向单一数据库,都是单数据源,一 ...
- shell 中的操作符
1.算术操作符 2.关系操作符 3.布尔操作符 4.字符串操作符 5.文件相关操作符 算术操作符 bash shell 没有提供任何机制来执行简单的算术运算,不过我们可以借助于一些其他程序,如 exp ...
- qsort和sort
sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为:#include<stdlib.h> ...
- 为什么只有一个元素的tuple要加逗号?
如果要定义一个空的tuple,可以写成(): >>> t = () >>> t () 但是,要定义一个只有1个元素的tuple,如果你这么定义: >>& ...
- Excel 中 VLOOKUP() 函数小结
应用场景: 数据仓库上游源系统的数据库表变更,现在需要拆分一部分数据出来,单独放到一张新表中.假设原表为A,新表为B,B表和A表结构大部分一样,只有字段的前缀不同,那么我们如何找出到底有哪些字段不同呢 ...