一、视图类

#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源码分析的更多相关文章

  1. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  2. django Rest Framework----GenericAPIView 通用视图 GenericAPIView源码分析

    一.GenericAPIView GenericAPIView扩展了APIView,为标准列表和详细视图添加了常见的行为. 提供的每个具体通用视图都是一个GenericAPIView或多个mixin类 ...

  3. Django rest framework 限制访问频率(源码分析)

    基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...

  4. Django_Restframwork_APIVIEW视图_源码分析

    Django _VIEW视图_源码分析

  5. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  6. Django之admin的使用及源码分析

    一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...

  7. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  8. Django(64)频率认证源码分析与自定义频率认证

    前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...

  9. Django day24 cbv和APIView的源码分析 和 resful的规范

    一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View   CBV(基于类的视图) - Function Base View   FBV(基于函数的视图) 2.as_vi ...

  10. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

随机推荐

  1. [CF671E] Organizing a Race

    题目大意 有\(n\)个加油站排成一行,编号为\(1\sim n\) ,\(i\)与\(i+1\)间有一条长为\(w_i\)千米的道路. 一辆汽车在经过加油站\(i\)时会得到\(g_i\)升汽油 , ...

  2. ZJOI2015地震后的幻想乡

    题面链接 洛咕 sol %%%_rqy 本来想写正常的状压,看到这篇题解就入坑了... 直接搬题解吧,写的太好了不用解释. 慢慢搬,先咕着QAQ #include<cstdio> #inc ...

  3. Java之NIO,BIO,AIO

    Hollis知识星球的一些学习笔记,有兴趣的朋友可以微信搜一下 什么是NIO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 ...

  4. Java之Java程序与虚拟机

    Java为什么要在虚拟机中运行 简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,不能直接翻译为机器码在机器上运行,所以设计者就设计了虚拟机,通过编译器将Java程序转换成虚拟机所能识别的 ...

  5. 【Asp.net入门2-01】C#基本功能

    C#是一种功能强大的语言,但并不是所有程序员都熟悉我们将在本书中讨论的所有功能.因此, 本章将介绍优秀的Web窗体程序员需要了解的C#语言功能. 本章仅简要介绍每一项功能.有关C#语言本身的知识不是本 ...

  6. 在阿里云上无法使用mailx发送邮件的解决办法,验证可用。

    由于阿里云已将25端口封了(改用465端口),所以在ECS上往外发邮件时要作相应的配置才行. 使用的是163的企业邮箱,笔记简洁可用. 在阿里云的“安全组”开放645端口通行. 1.安装相应软件包: ...

  7. linux命令总结之dig命令

    Dig简介: Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具.Dig的源码是ISC BIND大包的一部分,但是大多编译和安装Bind的文档都不把它包括在内 ...

  8. js正则表达式----replace

    1.分组 '442665319@qq.com'.replace(/(\d+)(@)(\w+)(\.com)/,'[$1]$2[$3]$4') //"[442665319]@[qq].com& ...

  9. P4711 「化学」相对分子质量

    P4711 「化学」相对分子质量 给你一个字符串让你输出相对分子质量(弱智字符串模拟) 我比赛tm调了两个半小时啊QAQ 希望以后能增加代码力吧,纪念挂代码 Code #include<iost ...

  10. org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session异常解决办法

    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread ...