DRF 中有多种view和viewsets,我整理了一下,如下图所示,接下来,我们分别了解下view,viewsets。

APIView

所有的view,viewsets都是继承APIView,而APIView是继承的django的django.views.generic.View, 然后增加了一些通用的操作,和重载了as_view,dispatch,options,http_method_not_allowed 方法来适应DRF相关的配置和后续的使用。

在直接使用APIView的时候,就和使用django View一样,分发规则也是一样,GET请求分发到了get方法,POST请求分发到post方法, 所以路由的注册方式也一样。所以在这里不做演示了。

GenericAPIView

通用view的基础视图,其他的基础view都是继承了这个view,我们可以来看看源码里面实现了那些个方法

  1. # 为了简化,我删掉了注释和具体的实现,
  2. class GenericAPIView(views.APIView):
  3. queryset = None # 这些会在mixins中用到
  4. serializer_class = None
  5. lookup_field = 'pk'
  6. lookup_url_kwarg = None
  7. pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
  8. def get_queryset(self):
  9. def get_object(self):
  10. def get_serializer(self, *args, **kwargs):
  11. def get_serializer_class(self):
  12. def get_serializer_context(self):
  13. def filter_queryset(self, queryset):
  14. @property
  15. def paginator(self):
  16. def paginate_queryset(self, queryset):
  17. def get_paginated_response(self, data):

可以看出,在这里,我们定义了queryset,serializer相关的操作。我们也可以继承GenericAPIView 来使用定义好的一些方法。

drf-mixins

在这里,我们插入mixins这一部分,因为后面要介绍的这些view,viewset,都是使用了这种方式实现,在DRF中,有5种mixin,我们还是看看源码里面,

  1. # 还是删除了多余的代码,只看有哪些方法,
  2. # 一共有5种mixin,分别实现列表显示,单个资源显示,增加,修改,删除操作。
  3. # 后面讲解的views,veiwsets就是通过继承不同的mixin来实现对应功能
  4. # 在这些方法的实现中,需要用到queryset,serializers,所以使用了mixin的时候,需要在view里指定这两个参数
  5. class CreateModelMixin(object):
  6. def create(self, request, *args, **kwargs):
  7. class ListModelMixin(object):
  8. def list(self, request, *args, **kwargs):
  9. class RetrieveModelMixin(object):
  10. def retrieve(self, request, *args, **kwargs):
  11. class UpdateModelMixin(object):
  12. def update(self, request, *args, **kwargs):
  13. class DestroyModelMixin(object):
  14. def destroy(self, request, *args, **kwargs):

*APIView

本部分讲解以APIView结尾这这些个views,包括CreateAPIView,ListAPIView,RetrieveAPIView, DestroyAPIView,UpdateAPIView, ListCreateAPIView, RetrieveUpdateAPIView, RetrieveDestroyAPIView, RetrieveUpdateDestroyAPIView。这些都是通过继承GenericAPIView 和不同的mixin实现,所以我们只选择其中的一个来作为讲解,下面看看ListAPIView 中的内容

  1. class ListAPIView(mixins.ListModelMixin,
  2. GenericAPIView):
  3. def get(self, request, *args, **kwargs):
  4. return self.list(request, *args, **kwargs)

因为继承的GenericAPIView,并没有修改分发方式,所以也是GET请求分发到get方法,又因为继承了ListModelMixin,所以会有list(self)方法,于是自然而然的,就在get方法中,调用self.list()去使用ListModelMixin中定义的方法。其他的views类似,都是把对应的请求转发到合适的mixin里面。至此,drf中的views就完了。

viewsets

下面,我们来研究研究viewsets了,它不同与django原生的view,因为有修改分发方式,所以处理上会有些许的不同,还是老规矩,上源码。

使用

  1. class ViewSetMixin(object):
  2. #代码就不贴了,需要配合着看route才能理解,准备后面单独开一篇来配合着route的处理来写,
  3. #在这里,我们只需要知道在这个类中,重写了分发规则as_view(),
  4. #规则大概来说就是,将对应的请求分发到list,create等在mixins定义了的方法中, 比如说,get请求分发到list,或者retrieve。
  5. class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
  6. pass
  7. class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
  8. mixins.ListModelMixin,
  9. GenericViewSet):
  10. # model的只读接口,实现了列表页和详情页的
  11. pass
  12. class ModelViewSet(mixins.CreateModelMixin,
  13. mixins.RetrieveModelMixin,
  14. mixins.UpdateModelMixin,
  15. mixins.DestroyModelMixin,
  16. mixins.ListModelMixin,
  17. GenericViewSet):
  18. # model 的增删改查的接口
  19. pass

通过源码,我们可以发现,我们可以自己选择继承GenericViewSet 和对应的mixins来实现我们所需要的接口。

路由注册

因为改了分发方式,所以,不能简单的像之前的 path('view', View.as_view())一样了,我们需要像下面这样引入route。

  1. from myapp.views import ViewSet
  2. from rest_framework.routers import DefaultRouter
  3. router = DefaultRouter()
  4. router.register(r'users', ViewSet) # url 为 "/api/user/"
  5. urlpatterns = [
  6. path('api/', include(router.urls), name='api'),
  7. ]

Django-rest-framework(三)view and viewsets使用的更多相关文章

  1. django rest framework通用view

    官方文档:http://www.django-rest-framework.org/ drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总结分析. 首先,我们看一下主要的几种vi ...

  2. Django REST framework 第六章 ViewSets & Routers

    REST framework包含了一个可以处理ViewSets的抽象, 它允许开发人员专注于API的状态跟交互进行建模,并使得URL构建结构基于通用的约定自动处理. ViewSet类跟View类几乎相 ...

  3. Django Rest Framework(3)-----APIView与Viewsets

    REST framework提供了一个APIView类,它是Django的View类的子类. REST framework主要的几种view以及他们之间的关系: mixins 到目前为止,我们使用的创 ...

  4. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  5. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

  6. Django REST framework 中文教程1:序列化

    建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...

  7. Django REST framework使用ViewSets的自定义路由实现过程

    在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...

  8. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  9. Django Rest Framework源码剖析(三)-----频率控制

    一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...

  10. Django REST framework+Vue 打造生鲜超市(三)

    四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py ...

随机推荐

  1. nginx反向代理使用网址速度变慢

    最近公司网址加载静态文件的速度总是跟不上于是试着用带端口的ip来访问, 发现速度快不少于是将nginx的代理修改为ip的如: location / { proxy_pass http://localh ...

  2. asp.net MVC3之AJAX实现(json)

    asp.net MVC3之AJAX实现(json)         分类:             Asp.net MVC              2011-08-10 13:55     2272 ...

  3. App调用safar

    /调用safar打开网页 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.cnblo ...

  4. 关于Java中用Double型运算时精度丢失的问题

    注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...

  5. Linux 套接字编程 - TCP连接基础

    第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...

  6. sql: 生日赠品中的相关算法

    ---2013年10月9日生日,就以2012年9月1日至2013年8月31日計算 (因為係生日月份前兩個月之最後一天為結算日) DECLARE @birthday datetime,@now date ...

  7. abc098D Xor Sum 2(two point)

    题意 题目链接 给出一个序列,求出有多少区间满足\(A[l] \oplus A[l+1] \oplus \dots \oplus A[r] = A[l] + A[l + 1] +\dots+ A[r] ...

  8. overflow:hidden的用法

    overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <%@ Page Language="C#& ...

  9. Python中变量的本质探索

    Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...

  10. Cloud

    Cloud = Data + Routing + Computing + Storage