django Rest Framework 系列3
来源:互联网 发布:改变 知乎 编辑:程序博客网 时间:2024/06/14 02:00
官方地址:http://www.django-rest-framework.org/tutorial/3-class-based-views/#rewriting-our-api-using-class-based-views
我们也可以使用基于类的视图来编写API视图,而不是基于函数的视图。我们将会看到,这是一种可以允许我们重用通用功能的强大模式,可以帮助我们保持我们的代码DRY(Don’t repeat yourself)
1. 使用基于类的View来重写API
我们从重写一个基于基类视图(class-based view)的根视图开始,所有涉及到的只需要一点点重构 views.py
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom django.http import Http404from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import statusclass 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 urlfrom rest_framework.urlpatterns import format_suffix_patternsfrom snippets import viewsurlpatterns = [ url(r'^snippets/$', views.SnippetList.as_view()), url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),]urlpatterns = format_suffix_patterns(urlpatterns)
好了,我们完成了。如果运行开发服务器,一切都应该像以前一样工作
2 . 使用混合 (Mixins)类
使用基于类的视图的最大优点之一是它可以很方便的重用代码。
我们使用很多相似支持 API view 的create/retrieve/update/delete操作。这些常用的操作都封装到了 REST框架中mixin类中。
让我们来看看怎样通过mixin类来构建这些视图,以下是 views.py的模块:
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import mixinsfrom rest_framework import genericsclass 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
来创建我们的视图,并加入 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) 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
类来提供核心功能, 并加入mixins 来提供 .retrieve()
,.update()
, .destory()
动作
3. 使用通用类视图(generic class-based views)
与之前的代码相比,通过混合(mixin)类我们用了较少的代码重新了视图,但我们可以更进一步。REST框架提供了一套混合通用视图更好的削减我们的views.py 模块。
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import genericsclass SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializerclass SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
哇,这很简洁。
- django Rest Framework 系列3
- django Rest Framework 系列 1
- django Rest Framework 系列 4
- django Rest Framework 系列 5
- django Rest Framework 系列 6
- django Rest Framework 系列 7
- Django REST framework
- Django REST framework API
- Django REST framework
- Django-Rest-Framework 教程
- django rest framework Serializer
- Django Rest Framework
- django rest framework quickstart
- Django rest framework
- Django rest framework --- Routers
- Django rest framework ---Serializers
- Django-Rest-Framework 入门
- Django Rest Framework - 初识
- iOS开发中,按钮不能点击的几种情况
- 从一个通用加法程序看模板
- Leetcode 3. Restore IP Addresses
- opencv学习(四十二)之多边形包围图像轮廓
- 插件化开发——替换if-else和switch
- django Rest Framework 系列3
- Educational Codeforces Round 19-E. Array Queries(简单dp)
- Mybatis逆向工程
- Latex使用小结(3)
- 汇编指令ebp与esp的关系与作用
- 读书笔记《Unix编程艺术》六
- 实现自己SpringMVC的RequestMapping
- python 学习笔记—— #(井号)的作用
- java 基本数据类型初始值(默认值)