【Django学习笔记 - 18】:drf请求响应简介、基类APIView、GenericAPIView、mixin扩展类与三级视图、视图集与路由

drf请求响应简介

请求Request

  1. 在DjangoViews中,每定义一个视图,都会传入一个默认的HttpRequest对象,这个HttpRequest对象由Django为我们创建。
  2. REST Framework传入视图的request对象就不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
  3. REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
  4. Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。无论前端发送的哪种格式的数据,我们都可以以统一的方式进行读取。

常用属性

  1. Data
    Request.data返回解析之后的请求体数据。类似于Django中标准的request.POST和request.FILES属性,但提供的如下特性:
    • 包含了解析之后的文件和非文件数据
    • 包含了POST、PUT、PATCH请求方式解析后的数据
    • 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
  2. query_params(查询字符串)
    request.query_params与标准的request.GET相同,只是更换了更准确的名称而已。

响应Response

此处的响应就不再是django中的HttpResponse对象了,而是由REST
framework提供的一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(渲染)成符合前端需求的类型(JSON,XML)。

RESTframework提供了Renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换相应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理相应数据,我们可以通过配置来修改默认响应格式。

构造方式

from rest_framework.response import Response

Response(data,status=None,template_name=None,headers=None,content_type=None)

注意:

  1. data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器来处理data
  2. Data不能是复杂结构的数据,例如Django的模型类对象,对于模型类对象的话,可以使用序列化器来进行序列化处理之后再传递给data参数。

参数说明

Data:为响应准备的序列化处理后的数据;
Status:状态码,默认为200;
Template_name:模板名称,如果使用HTMLRenderer时需要指明;
Headers:用于存放响应头信息的字典;
Content_type:响应数据的Content_type,通常此参数无需传递,REST framework会根据前端所需类型数据类设置该参数。

Response常用属性

  1. Data传给response对象的序列化器后,但还没有经过render处理的数据

  2. status_code
    状态码

  3. Content
    经过render处理后的响应数据

基类

REST Framework为我们提供了视图的基类,继承于django的View父类。其位于rest_framework.views中

APIView的使用

  1. APIView类
    位置:rest_framework.views.APIView
    APIView是REST Framework提供的所有视图的基类,继承于Django的View父类。
    APIView与View的不同之处:
    传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
    视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
    任何APIException异常都会被捕获到,并且处理成合适的响应信息;
    在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

使用案例

案例一:查看drf的结构

  • 先创建一个子应用

    在这里插入图片描述

  • 在自应用的views.py文件中导入APIView并写上函数

导入模块:
from rest_framework.views import APIView
from rest_framework.response import Response

class HusbandAPIView(APIView):

    def get(self, request):
        data = request.data
        print(data)
        print(type(data))
        return Response({'message':'请求处理成功'})
  1. 配置路由

    在这里插入图片描述


    在这里插入图片描述

  2. 运行项目,在网页中可看到drf的结构

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

案例二:使用post请求获取表单和非表单数据

  1. 写上post方法

    在这里插入图片描述

  2. 使用Postman发送表单请求

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

  3. 接收非表单的数据

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

案例三:使用get方法获取查询字符串

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

GenericAPIView

  1. GenericAPIView
    位置:rest_framework.generics
    继承自APIView,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
    支持定义的属性
    列表视图与详情视图通用
    queryset:列表视图的查询集
    serializer_class:视图使用的序列化器
    列表视图使用
    pagination_class:分页控制
    filter_backends:过滤控制后端
    详情页视图使用
    lookup_field:查询单一数据库对象时使用的条件字段,默认为’pk
    lookup_url_kwarg:查询单一数据时URL中的参数关键字名称,默认与look_field相同

导入模块:
from rest_framework.generics import GenericAPIView

使用演示

演示一

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

  • 重写get_quertyset()函数

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

演示二:使用序列化器

在这里插入图片描述

使用Postman发送请求后

在这里插入图片描述

GenericAPIView

与APIView相比,多了数据的全局指定,不用在每一个方法中都进行数据的查询,更加节省内存
优点:
1、不用再每一个方法中进行数据库的交互。
2、一次性将所有的数据都直接缓存下来,然后在方法中获取的时候就是直接在缓存中去去除数据,避免了每一次都会与数据库进行交互造成资源的大量浪费。

mixin扩展类与三级视图

扩展类

位置:rest_framework.mixins

  1. ListModelMixin:列表视图扩展类,提供list(request,*args,**kwargs)方法快速实现列表视图,返回200状态码,该Mixin扩展类的list方法会对数据进行过滤和分页。
  2. CreateModelMixin:提供create(request,**kwargs)方法快速实现创建资源的视图,成功返回201状态码,如果序列化器对前端发送的数据验证失败,返回400错误。
  3. RetrieveModelMixin:详情视图扩展类,提供retrieve(request,**kwargs)方法,可以快速实现返回一个存在的数据对象
  4. UpdateModelMixin:更新视图扩展类,提供update(request,**kwargs)方法,可以实现局部更新。成功返回200,序列化器校验数据失败时,返回400错误。
  5. DestroyModelMixin:删除视图扩展类,提供destroy(request,**kwargs)方法,可以快速实现删除一个存在的数据对象。成功则返回204,不存在则返回404

注意:以上五个扩展类使用方法一样,需要导入扩展类,定义的视图继承扩展类与GenericAPIView类,然后直接return调用扩展类为我们提供的方法即可

ListModelMixin

导入模块:
from rest_framework.mixins import ListModelMixin
mixin扩展类最好和GenericAPIView结合使用,否则可能会报错

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

三级视图

为什么称之为三级试图,感觉优点违规,别人写很多代码才能实现的查询、添加、删除等逻辑,三级视图直接继承即可使用

导入模块:
from rest_framework.generics import ListAPIView

在这里插入图片描述


在这里插入图片描述

视图集与路由

视图集

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • GET: list() 提供一组数据
  • GET: retrieve() 提供单个数据
  • POST :create() 创建数据
  • PUT :update() 更新数据
  • PATCH: partail_update, 更新部分数据
    DELETE:destory() 删除数据
    ViewSet视图集类不再实现get()、post()等方法,而是实现动作action如 list() 、create() 等。

导入模块:
from rest_framework.viewsets import ModelViewSet

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

  • 自定义方法

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

路由

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

路由参数

路由器只能结合视图集一起使用,默认只为标准了增删改查行为生成路由信息,如果想让自定义的行为也生成路由需要在自定义行为上用action装饰进行装饰。
register(prefix,viewset,base_name)

  • prefix:该视图集的路由前缀
  • viewset:视图集
  • basename:路由名称的前缀

如上述代码形成的路由如下:
heroapi/ name:hero-list
heroapi/ name:hero-detail

使用方法

导入模块:
from rest_framework.routers import DefaultRouter

  • 创建router对象,并注册视图集

    在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

原文地址:https://blog.csdn.net/Oh_Python

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path('authors/$', views.AuthorView.as_view()), re_path('book/(?P\d+)/$', vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = ''' <li><s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 > 依赖jQuery文件 实例-->GET请求: 手动发送 > 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render