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。其代码如下:

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 字段指示了下一页的链接,这样分页访问资源就变的非常方便了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈django不使用restframework自定义接口与使用的区别

    django可以使用restframework快速开发接口,返回前端所需要的json数据,但是有时候利用restframework开发的接口并不能满足所有的需求,这时候就需要自己手动开发接口,也就是将需要用到的某些对象转化为需要使用的json数据,今天记录一下django自己定义接口的一种方法与思路 假设我们定义三张数据表,分别是问卷,问题,选项.一张问卷包含不同的问题,一个问题可以设置不同的选项,自定义的接口可以实现查看所有或单个问卷的标题与id,可以查看所有或单个问题的所属问卷,问题标题,问

  • django rest framework vue 实现用户登录详解

    后端代码就不介绍了,可以参考 django rest framework 实现用户登录认证 这里介绍一下前端代码,和前后端的联调过程 在components下新建login.vue 文件 <template> <div class="login"> <el-form label-width="80px"> <el-form-item label="用户名"> <el-input v-model

  • django restframework serializer 增加自定义字段操作

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现这个目的. 假设现在有一个Animal模型,其中有name, type, country字段,country为外键.我们在序列化Animal时,需要额外增加外键country的area信息. 方法一修改数据库,利用model 这里就不多解释,主要来说第二种,不修改django的model,直接使用S

  • 利用rest framework搭建Django API过程解析

    思路步骤: 创建一个可以序列化的类 去数据库取数据交给序列化的类处理 把序列化的数据返回前端 操作流程: # 安装模块 pip install djangorestframework # settings.py配置 1. apps中注册 INSTALLED_APPS = [ '...', 'rest_framework', ] 2.末尾添加以下代码,访问权限 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` perm

  • Django rest framework分页接口实现原理解析

    如果没有设置分页,django-rest-framework 会将所有资源类表序列化后返回,如果资源很多,就会对网站性能造成影响.为此,我们来给博客文章列表 API 添加分页功能. django-rest-framework 为分页功能提供了多个辅助类,常用的有: PageNumberPagination 将资源分为第 1 页.第 2 页...第 n 页,使用页码号请求分页结果. LimitOffsetPagination 通过 limit 和 offset 两个参数来控制请求的资源.例如通过发

  • django基于restframework的CBV封装详解

    一.models数据库映射 from django.db import models # Create your models here. class Book(models.Model): title=models.CharField(max_length=32) price=models.IntegerField() pub_date=models.DateField() publish=models.ForeignKey(to="Publish") authors=models.

  • django rest framework使用django-filter用法

    django rest framework使用django-filter注意事项: 一定要在setting文件里面加载如下代码,而不是只安装包,否则django应用不报错,但是不能正确过滤. "` INSTALLED_APPS = [ 'django_filters' ] REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ( 'django_filters.rest_framework.DjangoFilterBackend', ), } 补充知识:re

  • Django rest framework jwt的使用方法详解

    一简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.该信息可以被验证和信任,因为它是数字签名的.JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名. JWT的组成部分: header Header是由下面这个格式的Json通过Base64编码(编码不是加密,是可以通过反编码的方式获取到这个原来的Json,所以JWT中存放的一般是不敏感的信息)生成的字符串,Header中存放的

  • Django rest framework使用类视图实现首页API

    django-rest-framework 类视图拓展自 django 的类视图,只是针对数据的序列化和反序列化等逻辑做了封装. django-rest-framework 中最基本的类视图是 views.APIView,这个类可以看成是上一篇教程中用到的 api_view 装饰器的类版本.这个类比较基础,其核心功能就是 HTTP 请求预处理.分发请求给对应的处理函数,以及 HTTP 响应后处理,还有就是 as_view 方法将类转为函数(要注意与被请求的 URL 绑定的视图必须是一个可调用对象

  • Django REST framework 视图和路由详解

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据. 在APIView中封装的request,就实现了请求数据的解析: 对于GET请求的参数我们通过request.query_params来获取. 对于POST请求.PUT请求的

  • Django REST framework视图的用法

    前言 在了解了REST farmwork封装的视图类之后,我对python的面向对象有了更深刻的理解. Django RESR framework框架内置的视图类充分发挥了面向对象封装与继承的特性. 自己写一个类似于DRF内置视图类的功能 实现一个图书出版社的增.删.改.查.查功能,两个查一个是查所有出版社,一个是查具体的某一个出版社. 首先是一个简略的表结构设计models.py: from django.db import models class Publisher(models.Mode

  • Django通用类视图实现忘记密码重置密码功能示例

    前言 在Django中有大量的通用类视图,例如ListView,DetailView,CreateView,UpdateView等等,将所有重复的增删改查代码抽象成一个通用类,只需要配置极少量的代码即可实现功能. 使用通用类视图完成找回密码功能 首先引入 from django.contrib.auth.views import PasswordResetView, PasswordResetConfirmView, \ PasswordResetDoneView, PasswordChange

  • django 类视图的使用方法详解

     前言 当我们在开发一个注册模块时.浏览器会通过get请求让注册表单弹出来,然后用户输完注册信息后,通过post请求向服务端提交信息.这时候我们后端有两个视图函数,一个处理get请求,一个处理post请求.两个视图函数都是不同的名字. 但是随着开发的进行.当你想要找到注册模块的这两个视图,太麻烦了.如果这两个视图函数能放在一起,归成一个类,作为注册模块的类.这样日后的维护将会方便很多.这时候,django的类视图就能实现这个功能了. 对比 在没有类视图前,视图是这样的: def get_regi

  • Django中针对基于类的视图添加csrf_exempt实例代码

    在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问.那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一 在类的 dispatch 方法上使用 @csrf_exempt from django.views.decorators.csrf import csrf_exempt class MyView(View): def get(self, request): return HttpResponse("hi"

  • Django serializer优化类视图的实现示例

    一. create优化 在serializer序列化中,我们通过创建序列化器对象的方式地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下: from django.http import JsonResponse from django.views import View import json from .models import Project from .serializers import ProjectsSerializer class Project

  • django如何通过类视图使用装饰器

    需求:当我们想禁止ip黑名单访问我们的某些页面时,例如注册页面.应该怎么操作呢? 解决方案:这时候我们可以设计一个装饰器,过滤ip黑名单. 装饰器的写法如下: from functools import wraps def ban_ip(func): @wraps(func) def wrapper(request,*args,**kwargs): IP = request.META.get("REMOTE_ADDR") if IP in ["127.0.0.1"]

  • django rest framework之请求与响应(详解)

    前言:在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我们还知道RESTful API的另一个特性就是,发送不同的请求动作,会返还不同的响应,这篇文章就讲一下django-rest-framework这个工具在这方面给我们带来的便捷操作. 一.Request对象 平时我们在写Django的视图函数的时候,都会带上一个request参数,这样就能处理平时搭建网站时,浏览器访问网页时发出的常规的HttpReques

  • django rest framework 数据的查找、过滤、排序的示例

    对于管理系统,常常需要展示列表数据,我们对于列表内的数据常常需要查找.过滤.排序等操作,其中查找等操作大部分是在后台进行的.django rest framework可以轻松的实现数据的查找.过滤等操作.接下来我们将以实际的例子进行介绍. 示例代码github地址: https://github.com/jinjidejuren/drf_learn 例如cmdb系统,作为资产管理系统常常需要对数据进行过滤或查找,获取期望的信息. 实现model 1.在这个示例项目中,需要实现对物理服务器的条件过

随机推荐