加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django REST FrameWork中文教程3:基于类的视图

发布时间:2020-12-15 17:13:26 所属栏目:大数据 来源:网络整理
导读:其实,与其使用基于方法(function based)的视图,我们更加倾向使用基于类(class based)的视图。接下来,你将看到这是一个强大的模式,是我们能够重用公共的功能,并且,帮我们保持代码DRY。 使用基于类的视图 重写我们的API 我们现在开始了。首先,重写

其实,与其使用基于方法(function based)的视图,我们更加倾向使用基于类(class based)的视图。接下来,你将看到这是一个强大的模式,是我们能够重用公共的功能,并且,帮我们保持代码DRY。

使用基于类的视图 重写我们的API

我们现在开始了。首先,重写根视图(root view),变成基于类的视图。所涉及的,只是对?views.py?文件的一点重构。

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请求方法之间,做了更好的分离。接着,我们将同样的更改我们,处理片段详细的视图,继续我们的views.py?文件:。

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)

看起来不错,它现在仍然非常类似于基于功能的视图。

我们还需要重构我们的snippets/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)

好的,我们完成了。 如果你启动服务,那么它应该像之前一样可以运行。

使用混入mixins

使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。

到目前为止,我们使用的创建/获取/更新/删除操作和我们创建的任何基于模型的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):
????#?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)

我们将花点时间好好看下这里的具体实现方式。我们使用GenericAPIView构建了我们的视图,并且用上了ListModelMixinCreateModelMixin

基类提供核心功能,而mixin类提供.list().create()作。然后我们明确地将getpost法绑定到适当的操作。都目前为止都是显而易见的。

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)

很相似,我们再次使用GenericAPIView类来提供核心功能,并在mixin中添加.retrieve().update().destroy()方法。

非常相似。这一次我们使用GenericAPIView来提供核心功能,并添加mixins来提供.retrieve().update().destroy()方法操作。

使用通用的基于类的视图

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

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:模式和客户端库


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读