API(三)之Class-based Views
使用基于类的视图重写API
我们首先将根视图重写为基于类的视图。所有这一切都涉及到重构views.py。
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView #APIView适用于CBV
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)
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 put(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)
好了,如果运行开发服务器,那么应该像以前那样工作。
Using mixins
使用基于类的视图的优势之一是 that it allows us to easily compose reusable bits of behaviour.
到目前为止,我们使用的创建/检索/更新/删除(create/retrieve/update/delete)操作将与我们创建的任何支持模型的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() #queryset是GenericAPIView的属性。
serializer_class = SnippetSerializer #serializer_class是GenericAPIView的属性。 def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) #list是ListModelMixin的方法。 def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) #create是CreateModelMixin的方法。
我们会花点时间仔细检查这里发生的情况。我们正在使用GenericAPIView创建视图,并把它加到ListModelMixin和CreateModelMixin中。
基类提供核心功能,而mixin类提供.list()和.create()操作。我们再明确绑定get和post方法,以适合这些操作。
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) #retrieve是RetrieveModelMixin的方法。 def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) #update是UpdateModelMixin的方法。 def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs) #destroy是DestroyModelMixin的方法。
Pretty similar. Again we're using the GenericAPIView class to provide the core functionality, and adding in mixins to provide the .retrieve(), .update() and .destroy() actions.
Using generic class-based views
我们使用mixin类重写了这些视图,使用的代码比以前少一些,但我们可以进一步。REST框架提供了一组已经混合的通用视图,我们可以使用它来让views.py模块更简化。
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics class SnippetList(generics.ListCreateAPIView): #get封装到ListCreateAPIView中了。
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): #get、put、delete都封装到RetrieveUpdateDestroyAPIView中了。
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
更简洁了!
API(三)之Class-based Views的更多相关文章
- RESR API (三)之Views
Class-based Views Django's class-based views are a welcome departure from the old-style views. - Rei ...
- 用JSON-server模拟REST API(三) 进阶使用
用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...
- Express4.x API (三):Response (译)
Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- 了解HTML5和“她”的 API (三)
Web Workers(后台线程) JavaScript是单线程的,较长的javascript运算会阻塞UI线程. web worker 是运行在后台的 JavaScript,不会影响页面的性能. 在 ...
- PhotoSwipe中文API(三)
http://photoswipe.com/documentation/api.html 所有的方法和这个网页上列出的属性是公开的.如果你想看看例子什么API可以做的,拿在默认PhotoSwipe U ...
- 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...
- Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作
1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...
- 天气预报API(三):免费接口测试(“旧编码”)
说明 我以参考文章为引子,自己测试并扩展,努力寻找更多的气象API... 本文所有测试均以青岛为例. 本文所列接口城市代码(cityid)参数都使用的 "旧编码": 全国城市代码列 ...
随机推荐
- 研究傅里叶变换的一本好书<<快速傅里叶变换及其C程序>>
快速傅里叶变换及其C程序 <快速傅里叶变换及其C程序>是中国科学技术大学出版社出版的.本书系统地介绍了傅里叶变换的理论和技术,内容包括傅里叶变换(FT)的定义.存在条件及其性质,离散傅里叶 ...
- OpenCV 学习笔记 05 级联分类器CascadeClassifier类
在人脸检测中,CascadeClassifier 是一个类,该类的作用是(基于官方已经训练好的数据文件 .xml)实例化一个检测器. 1 类 CascadeClassifier 的概述 首先看一下该类 ...
- C#:网络传输问题
1.Http Post Header 中文数据值,服务端接收Header 中文数据值乱码问题: 客户端: Encoding utf8Encoding = Encoding.GetEncoding ...
- SNF开发平台WinForm-表单验证控件-通用
CS程序也能做到像BS程序一样的验证效果,如下: 1.验证控件的展示 校验时如果不符合验证条件的控件,会在控件上显示较显眼的图标. 当出现不符合验证的控件时,鼠标悬浮会显示自定义的提示信息. 如:输入 ...
- struts2:表单标签
目录 表单标签1. form标签2. submit标签3. checkbox标签4. checkboxlist标签5. combobox标签6. doubleselect标签7. head标签8. f ...
- 【经验分享】我经历的几门MOOC
这半年来,从1月初到6月底,在coursera上注册了4们有关数据分析/挖掘的课程.这些课程都是利用业余时间学习,每周基本上花5个小时左右.其中通过了3门,注销了一门.感觉还是学到了一些东西. 第一门 ...
- Coding in Delphi(前4章翻译版本) (PDF)
第四章翻译完成有一段时间了 写在前面的话 本次翻译纯属爱好,目的是提高对英文文档的理解和阅读能力,本文档大部分采用直 译的方式,而且保留了原来的英文.目的只是辅助大家理解,不喜勿喷.翻 ...
- Android遍历API (1) 动画篇——克隆动画AnimationCloning
从我学Android开始,一直就想做一件事.就是好好把APIDemo看一遍.今天开始会抽时间把Android官方的APIDemo程序全部过一遍.主要是为了两个目的:第一,复习以前学习的API用法.第二 ...
- 【九天教您南方cass 9.1】 12 道路断面土方计算
同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取 在测量空间中. [点击索取cass教程]5元立得 (给客服说暗号 ...
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-5 底层驱动之SDRAM读写(下)
源视频包下载地址: 链接:http://pan.baidu.com/s/1jIC2LKy 密码:zyn3 银杏科技优酷视频发布区: http://i.youku.com/gingko8