REST-framework快速构建API--四部曲

代码目录结构:

 

一、使用原生APIView

使用rest-framework原生的APIView实现过程:

以url(r'^books/$', views.BookView.as_view(),name="books")为例进行流程分析,

  • 1、views.BookView.as_view()==>APIView的as_view方法==>父类【View】的as_view方法
  • 2、View的as_view方法实际上是返回了View下的view方法
  • 3、view实际上是执行了dispatch方法
  • 4、dispatch执行过程是去找对应的get/post/put/delete/patch方法

代码实现如下:

urls文件

PublishView用于处理publishes的get和post,获取多个资源的情况

PublishDetailView用于处理publishes/1/的get、put、delete,获取单个资源的情况

url(r'^publishes/$', views.PublishView.as_view(),name="publish"),
url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), 

  

views文件

使用rest-framework原生的APIView,按照上面说的流程,最后进入dispatch方法,所以只需要我们自己重写get/post/put/delete等方法即可。

from rest_framework.views import APIView
# Publish表
class PublishView(APIView):def get(self,request):publish_list = Publish.objects.all()ps = PublishModelSerializers(publish_list, many=True)return Response(ps.data)def post(self,request):# post请求的数据ps = PublishModelSerializers(data=request.data)if ps.is_valid():print(ps.validated_data)ps.save()  # create方法return Response(ps.data)else:return Response(ps.errors)
class PublishDetailView(APIView):def get(self, request, pk):publish = Publish.objects.filter(pk=pk).first()ps = PublishModelSerializers(publish)return Response(ps.data)def put(self, request, pk):publish = Publish.objects.filter(pk=pk).first()ps = PublishModelSerializers(publish, data=request.data)if ps.is_valid():ps.save()return Response(ps.data)else:return Response(ps.errors)def delete(self, request, pk):Publish.objects.filter(pk=pk).delete()return Response()

  

serializer文件

通过ModelSerializer类,指定model和fields进行序列化操作。

from rest_framework import serializersfrom app01.models import *
# 为queryset,model对象做序列化
class PublishSerializers(serializers.Serializer):name = serializers.CharField()email = serializers.CharField()class PublishModelSerializers(serializers.ModelSerializer):class Meta:model=Publishfields="__all__"

  

原生APIView的缺点

针对每个model,需要自己写API的各种方法,代码重复程度很高。

进一步解决办法:使用mixins

二、使用mixins

mixins在上一步的基础上进行了进一步的封装,也就是把多资源情况下的GET/POST以及单资源情况下的GET/POST/PUT/DELETE进行了再次封装,只要我们指定集成的类,然后重写对应的方法即可,urls也不用变更。

from rest_framework import mixins
from rest_framework import genericsclass AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):queryset=Author.objects.all()serializer_class =AuthorModelSerializersdef get(self,request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self,request, *args, **kwargs):return self.create(request, *args, **kwargs)class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):queryset = Author.objects.all()serializer_class = AuthorModelSerializersdef get(self,request,*args, **kwargs):return self.retrieve(request,*args, **kwargs)def delete(self,request,*args, **kwargs):return self.destroy(request,*args, **kwargs)def put(self,request,*args, **kwargs):return self.retrieve(request,*args, **kwargs)

  

使用mixins还是有代码重复的缺点,每个model表都需要重写这一堆方法和类。

 

三、使用generics

使用generics可以很好的避免上面的问题,他直接包含了多资源和单资源情况下的所有方法,而不需要重写get、post、put、delete方法,甚至还包括patch方法。

from rest_framework import mixins
from rest_framework import genericsclass AuthorView(generics.ListCreateAPIView):queryset=Author.objects.all()serializer_class =AuthorModelSerializersclass AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):queryset = Author.objects.all()serializer_class = AuthorModelSerializers

  但是这里还有一个缺点,就是单资源和多资源的视图函数以及url都是两份,是不是可以进行一步封装呢?

四、使用viewsets

使用viewsets可以通过在as_view中传参进一步简化操作。

在as_view中传入{动作:方法}的字典给action参数,然后通过getattr和setattr方法进行参数解析,然后通过dispatch中执行对应的方法。

urls文件

url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get': 'retrieve','put': 'update','patch': 'partial_update','delete': 'destroy'}),name="book_detail"),

  

views文件

class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializers

  

这就是最终版本,对于一个model表,url两个,一个ModelViewSet类就可以轻易的实现一个API!

进一步简化

我们可以看到urls里面看上去是不是很乱的样子,其实,rest-framework也已经解决了这个脏乱差的问题,通过使用routers!

urls文件修改

以books为例:

 

from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from app01 import views#router实例化,并将Viewset进行注册
router = routers.DefaultRouter()
router.register(r'books',views.BookViewSet)#路由控制
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^publishes/$', views.PublishView.as_view(),name="publish"), #  View:view(request)=====APIView:dispatch()url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), #  View:view(request)=====APIView:dispatch()url(r'',include(router.urls)),]

 

  

其他Viewset需要实例化,同样的操作即可,urls的最终结果为:

from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from app01 import views#router实例化,并将Viewset进行注册
router = routers.DefaultRouter()
router.register(r'books',views.BookViewSet)
router.register(r'books',views.PublishViewSet)#路由控制
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'',include(router.urls)),]

  是不是很简洁?

 

转载于:https://www.cnblogs.com/skyflask/p/10398679.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aix内核是linux,查看Linux及AIX硬件信息方法总结

一. CPU信息1. AIX1.查看CPU核心数&#xff1a;# pmcycles -m# pmcycles -mCpu 0 runs at 1900 MHzCpu 1 runs at 1900 MHzCpu 2 runs at 1900 MHzCpu 3 runs at 1900 MHz2.查看逻辑CPU个数# bindprocessor -q# bindprocessor -qThe available processors are: 0 1 2 33.查看CP…

Tomcat-部署多个项目(不同端口)

20190713 整理 参考文档 https://blog.csdn.net/chenchunlin526/article/details/78799772 如何在Tomcat服务中&#xff0c;为不同端口部署不同项目&#xff1f; https://jingyan.baidu.com/article/2f9b480ddda95e41cb6cc2a2.html Tomcat manager 配置 https://blog.csdn.ne…

JavaFX技巧2:使用Canvas API进行清晰绘图

当我最初开始使用Canvas API时&#xff0c;我注意到渲染代码的结果有些模糊&#xff0c;甚至更糟&#xff0c;不一致。 有些线条模糊&#xff0c;有些线条清晰。 来自Swing&#xff0c;我花了一些时间才意识到这是由JavaFX的坐标系引起的&#xff0c;该坐标系允许双精度渲染。 …

在阳光下歌唱

在阳光下歌唱 ——代腾飞 2007年11月27日 于成都 在寒冬迷雾阴霾已久的早上 突然迎来了一轮金色的太阳 清新的晨风轻抚着我的脸庞 一缕缕暖暖的阳光洒子身上 让人倍感清新爽朗欢心舒畅 昔日的忧伤也不再让人惆怅 往日的苦难也顿时被人遗忘 骑着车儿在阳光下尽情歌唱 我歌唱秋…

[Apple开发者帐户帮助]五、管理标识符(4)注册一个应用程序组

您需要注册一个或多个组才能启用应用组。 所需角色&#xff1a;帐户持有人或管理员。 在“ 证书”&#xff0c;“标识符和配置文件”中&#xff0c;从左侧的弹出菜单中选择操作系统。 在“标识符”下&#xff0c;选择“应用程序组”&#xff0c;然后单击右上角的“添加”按钮&…

JDK 8中的Oracle Drops Collection文字

在OpenJDK JEP 186上的一个帖子中&#xff0c;Oracle的Brian Goetz通知Oracle在JDK8中不会将集合文字用作语言功能。 集合文字是一种语法表达式形式&#xff0c;其求值形式为数组&#xff0c;列表或映射的聚合类型。 Project Coin提出了集合文字&#xff0c;这也补充了Java SE…

linux软件安装非系统盘,linux操作系统可不可以像安装windows软件一样在windows系统下的硬盘上安装...

linux操作系统可不可以像安装windows软件一样在windows系统下的硬盘上安装答案:2 信息版本&#xff1a;手机版解决时间 2020-07-24 14:13已解决2020-07-23 16:48打开linux操作系统iso压缩包,没有setup,听说要在虚拟机上安装&#xff0c;能不能不用虚拟机安装&#xff0c;在硬盘…

java中值传递和引用传递

1&#xff1a;按值传递是什么 指的是在方法调用时&#xff0c;传递的参数是按值的拷贝传递。 按值传递重要特点&#xff1a;传递的是值的拷贝&#xff0c;也就是说传递后就互不相关了。 2&#xff1a;按引用传递是什么 指的是在方法调用时&#xff0c;传递的参数是按引用进行传…

HTML5 Inline SVG

这是效果图&#xff1a; 1 <!DOCTYPE html>2 <html>3 <head>4 <meta content"text/html; charsetutf-8" http-equiv"Content-Type" />5 <title>geovindu svg</title>6 </head>7 <body>8 9 <svg width&…

【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera

前言 新到手一块板子&#xff0c;程序编译成功之后&#xff0c;运行出现错误&#xff0c;不能连接到摄像头。 问题 VIDEOIO ERROR: V4L: index 0 is not correct! Unable to connect to camera 查询系统摄像头接口 ubuntumyimx6ek200:~/build$ ls /dev/vi* /dev/video0 /dev/vi…

linux 卸载lv,Linux 软件安装、卸载、查询

平台构建及注意事项软件安装、配置等一、RPM 安装方法&#xff1a;# RPM -ivh XXX.rpm软件将被安装到缺省目录下。(不可指定安装路径&#xff01;)二、软件卸载&#xff1a;1、查询安装的软件注册名称&#xff1a;# rpm -q -a 部分可猜测软件名前缀 *2、卸载软件&#xff1a;#…

前端开发网络——Ajax(GET、POST)

ajax请求的过程 我们平时输入的网址&#xff0c;比如www.baidu.com&#xff0c;就会被解析成14.215.177.39这一串数字&#xff0c;然后发送请求给后台服务器&#xff08;客户端发送http请求&#xff09;。 服务器会确认你发送的是什么请求&#xff0c;需要请求什么东西&#xf…

通过Spring将继承树加载到List中

我注意到有趣的Spring功能。 我的一位同事使用它将Spring Bean的整个继承树加载到列表中。 在学习Spring文档时错过了这一点。 让我们来看看Spring bean的继承树&#xff1a; 下面的代码片段是通过构造函数注入将该豆树加载到列表中的&#xff1a; Component public class N…

CSS DIV Shadow

css code: /*2011-11-28 塗聚文 締友計算機信息技術有限公司CSS DIV Shadowcss3 */#geovinduDiv-shadow{padding:10px;background-color:#f9f9f9;border:1px solid #fff;position:relative;/*Firefox*/-moz-box-shadow: 3px 3px 4px #000;/*Safari,Chrome*/-webkit-box-shadow:…

面试题1——反转单链表

题目 反转一个单链表 实现 1.&#xff08;递归法&#xff09;利用递归思想&#xff0c;从头结点递归遍历到最后一个结点&#xff0c;递归返回最后一个结点并修改指针&#xff0c;使指针指向前一个结点。 2.&#xff08;移动指针&#xff09;定义当前结点指针cur&#xff0c;前一…

在VS2003下把一个DataTable Update 到数据库

假设一个常见的场景先吧----实际也是我当前的场景-----把一个excel 文件导入到数据库. 这实在是一个常见的功能,但是,没想到的是, 我着实费了一把劲. 实际上,我以前写的有现成的函数来完成这个工作, 但是, 可惜那函数只能在VS2005 下工作, 在2003下面无效,无效的原因是,vs2003 …

linux 挂载有数据硬盘分区,linux下磁盘分区、挂载知多少

0x01 Linux 分区简介主分区 vs 扩展分区硬盘分区表中最多能存储四个分区&#xff0c;但我们实际使用时一般只分为两个分区&#xff0c;一个是主分区(Primary Partion)一个是扩展分区(extended partition)&#xff0c;主分区可以马上被使用但不能再分区&#xff0c;扩展分区必须…

sublime text3

注册码注册信息 v3143可用 —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D136 94D7F7D4 95BC8C1C 527DA828 560BB037 D1EDDD8C AE7B379F 50C9D69D B35179EF 2FE898C4 8E4277A8 555CE…

Java 8中的HashMap性能改进

HashMap<K, V>是每个Java程序中快速&#xff0c;通用且无处不在的数据结构。 首先是一些基础知识。 您可能知道&#xff0c;它使用键的hashCode()和equals()方法在存储桶之间拆分值。 存储桶&#xff08;箱&#xff09;的数量应略高于映射中的条目数&#xff0c;以便每个…

css 汉字注音,日本语片假名

代码 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http://www.w3.org/1999/xhtml">3 4 <head>5 <meta content"te…