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是 ...
随机推荐
- easyui动态生成双列头
实习时老大交给任务,让我做这样一个效果,选择日期并点击查询时,动态生成列头,下一列要求对应日期的星期. 效果图: 下面贴出查询的单击函数: //查询按钮 function queryByDate(){ ...
- BZOJ 4421: [Cerc2015] Digit Division
4421: [Cerc2015] Digit Division Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 348 Solved: 202[Subm ...
- BZOJ 3143 游走 | 数学期望 高斯消元
啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下 ...
- Java的内存结构
Java中的内存结构 运行时数据区域的划分: 程序计数器(PC寄存器) 程序计数器(Program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 ...
- HEOI 2017 游记
HEOI2017也算是落下帷幕了,那就写一篇 流水账 游记好了. DAY 0 又是熟悉的大学,又是熟悉的机房 YD宾馆的房间依旧破的不行. 晚上在房间颓颓颓....=.= DAY 1 上午去试机,唯一 ...
- OS X 安装pyspider
pyspider安装的过程中,需要安装pycurl.有几个坑 一.首先遇到权限的问题 因为/Library目录是root权限,所以非root用户对该目录的读写经常会遇到权限问题,但是不宜切换成root ...
- springcloud之Hystrix
1.Hystrix出现的背景 从上面看来,Hystrix避免了雪崩效益,对于失败的服务可以快速失败. 2.为了解决雪崩效应的解决方案: (1)超时机制 (2)断路器模式Hystrix 3.Hystri ...
- Redis 创建多个端口 链接redis端口
默认的是6379 可以用6380,6381开启多个 1.开启 ./redis-server ../etc/redis.6380.conf & 2.链接 redis-cli -p 6380 查看 ...
- 转:iOS-CoreLocation:无论你在哪里,我都要找到你!
1.定位 使用步骤: 创建CLLocationManager示例,并且需要强引用它 设置CLLocationManager的代理,监听并获取所更新的位置 启动位置更新 1 2 3 _manager = ...
- bzoj千题计划171:bzoj2456: mode
http://www.lydsy.com/JudgeOnline/problem.php?id=2456 任意删除序列中两个不同的数,众数仍然是众数 不停的删,剩下的最后的数一定是众数 具体实现: 记 ...