Django REST FrameWork中文教程3:基于类的视图
其实,与其使用基于方法(function based)的视图,我们更加倾向使用基于类(class based)的视图。接下来,你将看到这是一个强大的模式,是我们能够重用公共的功能,并且,帮我们保持代码DRY。 使用基于类的视图 重写我们的API我们现在开始了。首先,重写根视图(root view),变成基于类的视图。所涉及的,只是对? 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): ????#?APIView实际继承django总的View ????#?from?django.views.generic?import?View ????""" ????#?这里是SnippetList接口描述 ????List?all?snippets,?or?create?a?new?snippet. ????""" ????def?get(self,?request,?format=None): ????????snippets?=?Snippet.objects.all() ????????#?manay=True?用于querySet对象 ????????serializer?=?SnippetSerializer(snippets,?many=True) ????????3?Respone比django的response更强大 ????????return?Response(serializer.data) ????def?post(self,?format=None): ????????serializer?=?SnippetSerializer(data=request.data) ????????if?serializer.is_valid(): ????????????#?.save()是调用SnippetSerializer中的create()方法 ????????????serializer.save() ????????????return?Response(serializer.data,?status=status.HTTP_201_CREATED) ????????return?Response(serializer.errors,?status=status.HTTP_400_BAD_REQUEST) 至此为止,一切顺利。看起来,跟之前的案例差别不大,但我们将各个HTTP请求方法之间,做了更好的分离。接着,我们将同样的更改我们,处理片段详细的视图,继续我们的 class?SnippetDetail(APIView): ????""" ????读取,?更新?or?删除一个代码片段(snippet)实例(instance). ????""" ????def?get_object(self,?pk): ????????try: ????????????return?Snippet.objects.get(pk=pk) ????????except?Snippet.DoesNotExist: ????????????raise?Http404 ????def?get(self,?pk,?format=None): ????????snippet?=?self.get_object(pk) ????????serializer?=?SnippetSerializer(snippet) ????????return?Response(serializer.data) ????def?put(self,?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,?format=None): ????????snippet?=?self.get_object(pk) ????????snippet.delete() ????????return?Response(status=status.HTTP_204_NO_CONTENT) 看起来不错,它现在仍然非常类似于基于功能的视图。 我们还需要重构我们的 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类编写视图的。这是我们的 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): ????#?mixins.CreateModelMixin?可以保存数据?????????????????? ????#?generics.GenericAPIView?继承了APIView ????queryset?=?Snippet.objects.all() ????serializer_class?=?SnippetSerializer ????def?get(self,?*args,?**kwargs): ????????#?self.list是ListModelMixin的list函数 ????????#?功能是过滤、分页、调用serializer,将数据序列化 ????????return?self.list(request,?**kwargs) ????def?post(self,?**kwargs): ????????return?self.create(request,?**kwargs) 我们将花点时间好好看下这里的具体实现方式。我们使用 基类提供核心功能,而mixin类提供 class?SnippetDetail(mixins.RetrieveModelMixin,????????????????????mixins.UpdateModelMixin,????????????????????mixins.DestroyModelMixin,????????????????????generics.GenericAPIView): ????queryset?=?Snippet.objects.all() ????serializer_class?=?SnippetSerializer ????def?get(self,?**kwargs): ????????return?self.retrieve(request,?**kwargs) ????def?put(self,?**kwargs): ????????return?self.update(request,?**kwargs) ????def?delete(self,?**kwargs): ????????return?self.destroy(request,?**kwargs) 很相似,我们再次使用 非常相似。这一次我们使用 使用通用的基于类的视图 通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的 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 哇,如此简洁。我们的代码看起来非常优雅。 接下来,我们将介绍本教程的第4部分,在这里我们将看看如何处理我们的API的身份验证和权限。 Django REST FrameWork中文文档目录: Django REST FrameWork 中文教程1:序列化 Django REST FrameWork 中文教程2:请求和响应 Django REST FrameWork 中文教程3:基于类的视图 Django REST FrameWork 中文教程4:验证和权限 Django REST FrameWork 中文教程5:关系和超链接API Django REST FrameWork 中文教程6: ViewSets&Routers Django REST FrameWork 中文教程7:模式和客户端库 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |