热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

4DjangoRESTFramework开发ViewSet

Afterroutinghasdeterminedwhichcontrollertouseforarequest,yourcontrollerisresponsibleformak

After routing has determined which controller to use for a request, your controller is responsible for making sense of the request and producing the appropriate output.

Routing 的职责是,决定哪一个 controller 应该对于收到的 request 做出回应,所以 controller 的作用是处理 request 并产生相对的 output 回应。
Aus


DRF 允许多个相关的 View 共同完善某个类的功能(多继承,类似 Java 的接口),并将诸多功能封装在单个类中,这样的类叫做 ViewSet。
一个 ViewSet 的类其实是某种 class-based View,该 View 不提供任何方法的 Handler 如:.get(), .post(), 但是提供 actions 如:.list(), .create()。 这些 actions 有助于使你的程序变得更加动态 (比如动态设置 Serilizer 会变得很方便)。
ViewSet 方法的 handler 则使用 .as_view()方法绑定到 View 的最终的相应操作上。一般 viewset 不在 urlconf 中配置,而是将其通过 router 类注册到应用程序上,router 会负责根据用户请求分发给相应 url。

相关知识点:ViewSetMixin
ViewSetMixin 重写 as_view 的信息,来达到定制路由的效果, 这个能让我们注册 url 变得更加简单。ViewSetMixin的源码部分如下:

1 class ViewSetMixin(object):
2 @classonlymethod
3 def as_view(cls, actions=None, **initkwargs):
4 ······
5 if not actions:
6 raise TypeError("The `actions` argument must be provided when "
7 "calling `.as_view()` on a ViewSet. For example "
8 "`.as_view({'get': 'list'})`")
9 ······


能看到在actions字段可以设置 {'get': 'list'} 这样的路由规则。

比如 urls.py 文件中配置:

my_product_list = ProductListViewSet.as_view({ 'get': 'list' })

另一种方法为创建 DefaultRouter 对象,然后用该对象注册 url。这种方法在工业中更被广泛地使用。

router = DefaultRouter()
router.register(r
'product', ProductListViewSet)

详见 Router 章节

ViewSetMixin 还有一个方法是initialize_request,这个方法主要是给 action 属性赋值,这个属性在设置动态 serializer 和 permission 的时候有很大的用处。

 

相关知识点 GenericViewSet:

GenericViewSet 类继承 GenericAPIView 和 ViewSetMixin,且提供了 get_object, get_queryset 方法以及其他的 generic view 的特征,但不会默认包括 action(所以需要通过继承特定类来实现)
在使用时必须重写该类,并且要么继承 mixin 类要么就自定义 action。

源码如下:

1 class GenericViewSet(ViewSetMixin, gernerics.GenericAPIView)
2 pass

由于 ViewSetMixin 类,这样继承了 GenericViewSet 的类就可以直接使用 router 对象配置 url 以及绑定 action。
由于 GenericAPIView 类, 这样继承了 GenericViewSet 的类就具有 queryset,serializer 以及 Pagination 的功能。

修改 views.py 文件:

1 class ProductListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
2 queryset = Product.objects.all()
3 serializer_class = ProductSerializer
4 pagination_class = ProductPagination

由于继承了 ListModelMixin 这样就自动有了 .list(request, *args, **kwargs) 的 action 方法。所以仅这段加上正确的 Router 配置,就可以实现展示商品 List 的效果。这也是它强于 GenericAPIView 的地方(即省略了 get -> list, post -> create 等函数的绑定)。

Extra 知识点 Routers:

由于 ViewSet 的 as_view() 方法,我们在 URL 配置时会简化很多操作,因为所有需要对 ViewSet 与 URL 的配置都可以使用 Router 类自动处理,这也使我们的代码变得更加规范。

例如:在 urls.py 文件中做下面操作:

1 from rest_framework.routers import DefaultRouter
2
3 router = DefaultRouter()
4 router.register(r'products', views.ProductListViewSet)
5
6 urlpatterns = [
7 url(r'^admin/', admin.site.urls),
8 url(r'^docs/', include_docs_urls(title="My Project")),
9 url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
10 url(r'^', include(router.urls)), # 所有在 router 对象上注册了的 ViewSet 都会被配置到 urlpatterns 中
11 ]

 在开发中 ViewSet 因为封装了大部分需要的操作,这些功能是它比 APIView 开发时更高效。一般只有在 ViewSet 的功能不够需要自定义一些特殊功能的时候,才会去自行编写稍微底层一点的 APIView 类。

转:https://www.cnblogs.com/crazy-chinese/p/9828138.html



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
author-avatar
轰炸籹厕所744
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有