Django rest framework使用类视图实现首页API
django-rest-framework类视图拓展自django的类视图,只是针对数据的序列化和反序列化等逻辑做了封装。
django-rest-framework中最基本的类视图是views.APIView,这个类可以看成是上一篇教程中用到的api_view装饰器的类版本。这个类比较基础,其核心功能就是HTTP请求预处理、分发请求给对应的处理函数,以及HTTP响应后处理,还有就是as_view方法将类转为函数(要注意与被请求的URL绑定的视图必须是一个可调用对象,普通的的类是无法被直接调用的)。除非需要深度定制视图函数的逻辑,一般情况下我们的视图不会直接继承这个类。
更为通用的类视图是GenericAPIView,这个类继承自APIView,对基类的功能做了拓展。继承自这个类的视图,只需对其类属性做一些简单的配置,就能获得获取单个资源、获取资源列表、资源列表分页等功能。当然,这个类作为其他特定功能类视图的基类,我们一般也很少使用。
回顾一下此前讲的RESTful架构的基本概念,客户端使用URL访问资源,通过HTTP请求的动词表达对资源的操作。django-rest-framework针对各种类型的资源操作,提供了对应的通用类视图,这些通用类视图主要包括:
CreateAPIView
用于创建资源的POST请求。
ListAPIView和RetrieveAPIView
用于访问资源列表和单个资源的GET请求。
DestroyAPIView
用于删除资源的DELETE请求。
UpdateAPIView
用于更新资源的PUT(全量更新)和PATCH(部分更新)请求。
以及以上视图的各种组合通用类视图:ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView。
博客首页API返回首页文章列表数据,显然应该选用的是ListAPIView。其代码如下:
fromrest_framework.genericsimportListAPIView fromrest_framework.paginationimportPageNumberPagination fromrest_framework.permissionsimportAllowAny classIndexPostListAPIView(ListAPIView): serializer_class=PostListSerializer queryset=Post.objects.all() pagination_class=PageNumberPagination permission_classes=[AllowAny]
Thatall!首页API就写好了。我们基本没有写任何逻辑代码,只是指定了类视图的几个属性值。因为逻辑基本都是通用的,通用类视图在背后帮我们做了全部工作,我们只要告诉它:用哪个序列化器去做,序列化哪个资源等就可以了。以这里的类视图为例,我们指定了:
使用PostListSerializer序列化器(通过serializer_class指定);
序列化博客文章(Post)列表(通过queryset指定);
对资源列表分页(通过pagination_class指定,PageNumberPagination会自动对资源进行分页,后面的教程会详细介绍分页功能);
允许任何人访问该资源(通过permission_classes指定,AllowAny权限类不对任何访问做拦截,即允许任何人调用这个API以访问其资源)。
最后一步就是在urls.py中绑定接口,把原来绑定的函数视图改为现在的类视图:
path('api/index/',views.IndexPostListAPIView.as_view())
启动开发服务器,打开浏览器访问http://127.0.0.1:8000/api/index/,可以看到和上一篇教程中使用函数视图返回的结果是一样的:
{ "count":201, "next":"http://127.0.0.1:10000/api/index/?page=2", "previous":null, "results":[ { "id":1, "title":"Markdown与代码高亮测试", "created_time":"2020-04-23T14:22:36.129383+08:00", "excerpt":"欢迎使用马克飞象\n@(示例笔记本)[马克飞象|帮助|Markdown]\n马克飞象是一款专为印象笔记(Ever", "category":{ "id":6, "name":"Markdown测试" }, "author":{ "id":1, "username":"admin" }, "views":0 } ] }
而且可以看到,返回的结果进行了分页,next字段指示了下一页的链接,这样分页访问资源就变的非常方便了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。