第 4 篇:用类视图实现首页 API

文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库
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。其代码如下:
from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import AllowAny
class IndexPostListAPIView(ListAPIView):
serializer_class = PostListSerializer
queryset = Post.objects.all()
pagination_class = PageNumberPagination
permission_classes = [AllowAny]
That all!首页 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 字段指示了下一页的链接,这样分页访问资源就变的非常方便了。

关注公众号加入交流群
第 4 篇:用类视图实现首页 API的更多相关文章
- django rest_framework入门四-类视图APIView
上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代 ...
- django framework插件类视图方法
1.使用类视图APIView重写API 类视图APIView,取代@api_view装饰器,代码如下: from rest_framework import status from rest_fram ...
- Django学习笔记第九篇--实战练习五--关于数据的改、删操作、数据库字段属性的设置和类视图
一.首先上代码.关于类视图: class register(View): #template_name = "templates/register.html" def get(se ...
- Django 类视图
引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: ...
- Django 官方推荐的姿势:类视图
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的. ...
- 第 3 篇:实现博客首页文章列表 API
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 此前在讨论基于模板引擎的开发方式和 django-rest-framework 开发 ...
- Django url中可以使用类视图.as_view()进行映射的原因
说明:在练习天天生鲜项目时,对利用类视图去与正则匹配到的url做映射有点疑惑,经过查看他人博客以及自我分析算是整明白了,所以记录一下 参考:https://www.zmrenwu.com/post/5 ...
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- Visual studio 类视图和资源视图不显示的问题
关于Visual studio 类视图和资源视图不显示的问题 解决方法: 1. 工具—选项—文本编辑器—C/C++—高级,浏览/导航下的禁用数据库选项置为False; 2. 输入命令:devenv / ...
随机推荐
- buuctf misc wp 02
buuctf misc wp 02 7.LSB 8.乌镇峰会种图 9.rar 10.qr 11.ningen 12.文件中的秘密 13.wireshark 14.镜子里面的世界 15.小明的保险箱 1 ...
- std::string 字符串分割
#include <iostream> #include <string> #include <vector> std::vector<std::string ...
- bat中的特殊字符,以及需要在bat中当做字符如何处理
bat中的特殊字符,以及需要在bat中当做字符如何处理 (2014-02-27 21:16:55) 转载▼ 标签: bat 特殊字符 分类: develop bat中的特殊字符,以及需要在bat中当做 ...
- AJ学IOS 之微博项目实战(1)微博主框架-子控制器的添加
AJ分享,必须精品 一:简单介绍 这是新浪微博的iOS端项目,来自于黑马的一个实战项目. 主要分成五大模块,本次全部运用纯代码实现,其中会用到很多前面学过得内容,如果有的地方有重复的知识点,说明这个知 ...
- ViewStub
在书上了解了ViewStub,但只是带过两笔,没能了解.在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub. ...
- PLSQL Developer 中文乱码踩坑记
环境 操作系统版本: Windows 7 PL/SQL 版本: 12.0.1.1814 原因 由于 Oracle 服务器端和客户端字符集编码不一致引起的. 注意点 写在最前面,减少踩坑!!! 网上教程 ...
- Daily Scrum 12/10/2015
Zhaoyang: Finished the implementation of query suggestion UI; Yandong: Changed the fusion algorithm ...
- 2. node xlsx的使用
1. 使用xlsx模块 const xlsx = require('xlsx'); //excel async exportexcel() { let arrayData = [ ['姓名', '电话 ...
- 初识phar反序列化&&复现bytectf_2019_easycms&&RSS思路
概要 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
- keras API的使用,神经网络层,优化器,损失函数,查看模型层数,compile和fit训练
layers介绍 Flatten和Dense介绍 优化器 损失函数 compile用法 第二个是onehot编码 模型训练 model.fit 两种创建模型的方法 from tensorflow.p ...