django rest framework 入门3——Class Based Views
来源:互联网 发布:java 跨域请求 编辑:程序博客网 时间:2024/05/22 01:39
转自:http://django-rest-framework.org/tutorial/3-class-based-views.html
Tutorial 3: Class Based Views
We can also write our API views using class based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code DRY.
Rewriting our API using class based views
We'll start by rewriting the root view as a class based view. All this involves is a little bit of refactoring.
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)
So far, so good. It looks pretty similar to the previous case, but we've got better separation between the different HTTP methods. We'll also need to update the instance view.
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)
That's looking good. Again, it's still pretty similar to the function based view right now.
We'll also need to refactor our URLconf slightly now we're using class based views.
from django.conf.urls import patterns, urlfrom rest_framework.urlpatterns import format_suffix_patternsfrom snippets import viewsurlpatterns = patterns('', url(r'^snippets/$', views.SnippetList.as_view()), url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),)urlpatterns = format_suffix_patterns(urlpatterns)
Okay, we're done. If you run the development server everything should be working just as before.
Using mixins
One of the big wins of using class based views is that it allows us to easily compose reusable bits of behaviour.
The create/retrieve/update/delete operations that we've been using so far are going to be pretty simliar for any model-backed API views we create. Those bits of common behaviour are implemented in REST framework's mixin classes.
Let's take a look at how we can compose our views by using the mixin classes.
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import mixinsfrom rest_framework import genericsclass SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.MultipleObjectAPIView): model = Snippet 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)
We'll take a moment to examine exactly what's happening here. We're building our view using MultipleObjectAPIView
, and adding in ListModelMixin
and CreateModelMixin
.
The base class provides the core functionality, and the mixin classes provide the .list()
and .create()
actions. We're then explicitly binding the get
and post
methods to the appropriate actions. Simple enough stuff so far.
class SnippetDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.SingleObjectAPIView): model = Snippet 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)
Pretty similar. This time we're using the SingleObjectAPIView
class to provide the core functionality, and adding in mixins to provide the .retrieve()
, .update()
and .destroy()
actions.
Using generic class based views
Using the mixin classes we've rewritten the views to use slightly less code than before, but we can go one step further. REST framework provides a set of already mixed-in generic views that we can use.
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import genericsclass SnippetList(generics.ListCreateAPIView): model = Snippet serializer_class = SnippetSerializerclass SnippetDetail(generics.RetrieveUpdateDestroyAPIView): model = Snippet serializer_class = SnippetSerializer
Wow, that's pretty concise. We've gotten a huge amount for free, and our code looks like good, clean, idiomatic Django.
Next we'll move onto part 4 of the tutorial, where we'll take a look at how we can deal with authentication and permissions for our API.
- django rest framework 入门3——Class Based Views
- python django rest framework Class-based Views
- django-rest-framework指南(3):Class Based Views(类视图)
- Django-Rest-Framework 教程: 3. 使用 class based views
- Django REST framework-教程03-class-based views原创翻译
- Django REST framework-API指南03-Class-based Views 原创翻译
- Django class-based views
- Django-Rest-Framework 入门
- django class-based views介绍与分析
- django rest framework 入门2——Request and Response
- django rest framework 入门2——Request and Response
- django rest framework 入门4——Authentication & Permissions
- django rest framework 入门5——Relationships & Hyperlinked APIs
- django rest framework 入门2——Request and Response
- Django rest framework API Guide的 Views 翻译
- Django rest framework API Guide的 Generic views 翻译
- Django REST framework-API指南04-Generic views 原创翻译
- django Rest Framework 系列3
- 如何使用C语言写: Generic Stack
- myeclipse @ . 自动提示配置
- ANSI方式文件操作
- 做事
- MAX232后缀的含义
- django rest framework 入门3——Class Based Views
- 画笔的异或模式
- Unity3d 应尽量避免使用foreach
- Linux的shell编程(二) (转)
- phpcms常用标签
- [更新]ZenCart首页随机产品横向滚动效果
- ASMCMD命令
- IOS开发之TableView以及TableViewCell背景设置
- Android 上层界面到内核代码的完整的流程分析,以alarm为例子