第 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 / ...
随机推荐
- Tomorrow - 地形生成(1)
原理很简单,请不要喷. 效果展示 种子输入框 种子为12345的地形 种子为23456的地形 代码展示 globalvar map random_set_seed(real(get_string ...
- EwoMail开源邮件服务器软件搭建
EwoMail开源邮件服务器软件简介 EwoMail是基于Linux的开源邮件服务器软件,集成了众多优秀稳定的组件,是一个快速部署.简单高效.多语言.安全稳定的邮件解决方案,帮助你提升运维效率,降低 ...
- mybatis 批量删除
mapper.xml: <update id="delete" parameterType="int"> delete from user_logi ...
- NCTF2018_easy_audit->coding_breaks
easy_audit 题目源码 <?php highlight_file(__FILE__); error_reporting(0); if($_REQUEST){ foreach ($_REQ ...
- ATmega328P定时器详解
写这篇文章,纯粹是想为博客拉点点击量.在博客园,游客访问好像是不计入阅读量的,而作为一个十八线博主,注册用户的访问应该以搜索引擎为主,博客园首页为次,个位数的粉丝就别谈了. 所以,希望各位从搜索引擎点 ...
- SpringCloud(一)学习笔记之项目搭建
[springcloud项目名称不支持下划线] 一.创建父项目 File---new---project: 填写项目信息: 默认即可,点击finish创建完成: 由于父项目只用到pom文件 所以把sr ...
- 异常处理方式一(try-catch-finally)
package com.yhqtv.demo01Exception; /* * 一.异常的处理,抓抛模型 * * 过程一:“抛”:程序在正常 执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异 ...
- Springboot整合https原来这么简单
1 简介 HTTP是不安全的,我们需要给它套上SSL,让它变成HTTPS.本文章将用实例介绍Springboot整合HTTPS. 2 密码学基础 要谈https就要谈Security,自然就要谈安全: ...
- jdbc-手写Java方法连接数据库
一.关键四元素 ① com.mysql.jdbc.Driver mysql数据库连接jar包. 获取途径: 链接:https://pan.baidu.com/s/1SFcjuu ...
- MySQL 主从复制:基于二进制文件复制配置详解
MySQL-主从复制:基于二进制文件复制详解 前言 主从复制是指把一个MySQL的数据库服务器作为主服务器(master),然后把master的数据复制到一个或者多个MySQL数据库服务器作为从服务器 ...