当前位置: 首页 > news >正文

Django REST框架-基于类的视图

以下代码基于前面的文件里面,请在前面的文件里边操作

3:基于类的视图

我们还可以使用基于类的视图编写我们的API视图,而不是基于函数的视图。正如我们将看到的,这是一个强大的模式,允许我们重用常用的功能,并帮助我们保持代码干。

使用基于类的视图重写我们的API

我们将首先将根视图重写为基于类的视图。所有这一切都涉及到一些重构views.py

 

from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class SnippetList(APIView): """ List all snippets, or create a new snippet.
  列出全部代码片段,或则创建新代码片段 """ def get(self, request, format=None): snippets = Snippet.objects.all() #获取全部 serializer = SnippetSerializer(snippets, many=True) #转化为json格式 return Response(serializer.data) def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) #获取修改数据 if serializer.is_valid(): #验证数据是否合法 serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

到现在为止还挺好。它看起来与以前的情况非常相似,但是我们在不同的HTTP方法之间有更好的分离。我们还需要更新实例视图views.py

class SnippetDetail(APIView): """ Retrieve, update or delete a snippet instance.
  提取 更新 删除代码片段 """ def get_object(self, pk): try: return Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: raise Http404 def get(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet) return Response(serializer.data) def patch(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): snippet = self.get_object(pk) snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT)
 

看起来不错 再次,它现在仍然非常类似于基于功能的视图。

我们还需要重构urls.py一下我们使用基于类的视图。

 
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$', views.SnippetList.as_view()), url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns)


好的,我们完成了 如果运行开发服务器,那么应​​该像以前一样工作。

使用mixins

使用基于类视图的大赢家之一就是让我们轻松地组合可重用的行为。

到目前为止,我们使用的创建/检索/更新/删除操作将与我们创建的任何支持模型的API视图非常相似。这些常见的行为是在REST框架的mixin类中实现的。

我们来看看我们如何使用mixin类编写视图。这是我们的views.py模块了。



from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import mixins from rest_framework import generics class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
 

我们会花点时间仔细检查这里发生的情况。我们正在使用的建筑我们的观点GenericAPIView,并在加ListModelMixinCreateModelMixin

基类提供核心功能,而mixin类提供.list().create()操作。然后,我们将明确的绑定getpost方法绑定到适当的操作。到目前为止足够简单的东西

 

 

class SnippetDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)

很相似 同样,我们正在使用的GenericAPIView类来提供核心功能,并混入增加提供.retrieve().update().destroy()行动。

使用mixin类,我们重写了这些视图,使用的代码比以前少一些,但我们可以进一步。REST框架提供了一组已经混合的通用视图,我们可以使用它来views.py更简单地修剪我们的模块。



from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import generics class SnippetList(generics.ListCreateAPIView): #列出全部代码片段,或则创建新代码片段 queryset = Snippet.objects.all() serializer_class = SnippetSerializer class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): # queryset = Snippet.objects.all() serializer_class = SnippetSerializer

哇,这很简洁。我们已经免费获得了大量的代码,而且我们的代码看起来很好,干净,惯用的Django。

接下来,我们将学习下一部分,我们将在此介绍如何处理API的身份验证和权限。

 

转载于:https://www.cnblogs.com/chenyang13677/p/7565511.html

相关文章:

  • 玩转算法面试:(三)LeetCode数组类问题
  • TensorFlow 之 高层封装slim,tflearn,keras
  • NetScaler的部署实验之七NetScaler Gateway的配置以及StoreFront集成NetScaler Gateway的配置更改...
  • myEclipse 中看jar源代码
  • bootstrap创建登录注册页面
  • 排列组合问题
  • 旗舰店揭幕大疆无人机用阿里云全球直播
  • 目标检测101:一文带你读懂深度学习框架下的目标检测
  • JavaScript实现分页效果
  • HttpClient5.x
  • 【转载】Docker 镜像优化与最佳实践
  • 数据分析后遗症:大数据互联网隐私之殇
  • 洗礼灵魂,修炼python(5)--python操作符,内置函数
  • System Error. Code:1722. RPC服务器不可用解决办法
  • Spring Boot开启的2种方式
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android系统模拟器绘制实现概述
  • codis proxy处理流程
  • Effective Java 笔记(一)
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • HTTP中GET与POST的区别 99%的错误认识
  • in typeof instanceof ===这些运算符有什么作用
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript 一些 DOM 的知识点
  • Objective-C 中关联引用的概念
  • vue中实现单选
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 将 Measurements 和 Units 应用到物理学
  • 漂亮刷新控件-iOS
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何设计一个微型分布式架构?
  • 微信小程序--------语音识别(前端自己也能玩)
  • 用 Swift 编写面向协议的视图
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​iOS实时查看App运行日志
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (9)STL算法之逆转旋转
  • (C++20) consteval立即函数
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (python)数据结构---字典
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (利用IDEA+Maven)定制属于自己的jar包
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Linux整合apache和tomcat构建Web服务器
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Micro Framework初体验
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)