【Django学习】(十一)APIView_请求与响应_GenericAPIView

这篇具有很好参考价值的文章主要介绍了【Django学习】(十一)APIView_请求与响应_GenericAPIView。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  •  继承DRF中APIView之后,那么当前视图就具备了认证、授权、限流等功能
  •  继承DRF中APIView之后,每一个实例方法中的request为Request对象
  •  Request类拓展了Django中的HttpRequest类,具备很多额外优秀的功能
  • Request类与HttpRequest类中的所有功能兼容
  • 查询字符串参数:request.GET、request.query_param推荐
  • 获取json格式参数:request.body(还需要decode解码)、request.data(直接获取到字典)
  • 获取www-form参数:request.POST、request.data
  • 获取multipart/form-data:request.body、request.POST、request.data

一、APIView

1、Request_解析类

from rest_framework.views import APIView

 视图集中引用APIView

class ProjectsDetailViews(APIView):
.
.
.

class ProjectsViews(APIView):
    # 创建数据
    def post(self, request):
        ret = {
            "msg": "传参异常",
            "code": 404
        }
        # json_str = request.body.decode('utf-8')
        # try:
        #     data_dict = json.loads(json_str)
        # 如果入参不是json格式数据,抛出异常
        # except json.JSONDecodeError:
        #     return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
        # 反序列化输入
        # serializer_obj = ProjectModelSerializer(data=data_dict)
        serializer_obj = ProjectModelSerializer(data=request.data)
        if not serializer_obj.is_valid(raise_exception=True):
            ret.update(serializer_obj.errors)
            return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
        serializer_obj.save()

        return JsonResponse(serializer_obj.data, json_dumps_params={"ensure_ascii": False}, status=200)
  •  上面的代码中注释掉入参为json格式数据的处理,使用drf框架中自带的解析类
    • JSONParser:解析JSON请求内容。
    • FormParser:解析 HTML 表单内容
    • MultiPartParser:解析多部分HTML表单内容,支持文件上传

 设置解析器:

可以使用DEFAULT_PARSER_CLASSES设置全局默认的解析器集。例如,以下设置将仅允许具有JSON内容的请求,而不是JSON或表单数据的默认值。

  • 定义解析器类,用于解析不通的前端参数类型
  • 会自动根据请求头中Content-Type来解析参数
  • 无论前端传递这三种参数中的哪一种参数,都可以使用request.data去获取

 本项目中的配置文件添加配置:

【Django学习】(十一)APIView_请求与响应_GenericAPIView,django,django,学习,python 

 发起post请求:

 【Django学习】(十一)APIView_请求与响应_GenericAPIView,django,django,学习,python

 如果发起的数据请求格式在解析类中没有定义,则发起请求时返回提示请求格式不支持

 【Django学习】(十一)APIView_请求与响应_GenericAPIView,django,django,学习,python

【Django学习】(十一)APIView_请求与响应_GenericAPIView,django,django,学习,python 

    # 创建数据
    def post(self, request):
        ret = {
            "msg": "传参异常",
            "code": 404
        }
        # json_str = request.body.decode('utf-8')
        # try:
        #     data_dict = json.loads(json_str)
        # 如果入参不是json格式数据,抛出异常
        # except json.JSONDecodeError:
        #     return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
        # 反序列化输入
        # serializer_obj = ProjectModelSerializer(data=data_dict)
        serializer_obj = ProjectModelSerializer(data=request.data)
        if not serializer_obj.is_valid(raise_exception=True):
            ret.update(serializer_obj.errors)
            return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
        serializer_obj.save()

        return JsonResponse(serializer_obj.data, json_dumps_params={"ensure_ascii": False}, status=200)

 指定了解析类后,我们在视图集里就可以不用再手动处理json格式或者其他格式的入参(代码被注释掉的部分) ,drf内部会自动帮我们处理

 

2、Response_渲染类

  • 定义渲染类,用于返回不同类型的数据
    • 会自动根据请求头中Accept进行渲染
    • 如果前端不指定Accept,那么默认返回json格式的数据
    • 如果指定Accept为application/json,那么也会以json数据返回
    • 如果指定Accept为text/html(浏览器发起GET请求会自动指定),那么会以html形式返回
  • 在DRF的视图中,一定要以Response返回 
  • Response类为HttpResponse的子类,具备HttpResponse中的所有功能
  • 可以自动根据请求头中的Accept参数,来返回相应数据格式到前端
  • 第一个参数为Python中的常用数据类型(字典、嵌套字典的列表),尽量使用序列化器类.data
  • status指定响应状态码,content_type指定响应体数据类型
  •  

settings.py配置文件 

【Django学习】(十一)APIView_请求与响应_GenericAPIView,django,django,学习,python 

 指定了渲染类后,我们在views.py视图集里也可以不用再手动处理json格式的出参了,drf会内部自动帮我们处理并返回,所以可以不使用JsonResponse进行返回了。

# return JsonResponse(serializer_obj.data, json_dumps_params={"ensure_ascii": False}, status=200)

 可以使用Response进行返回:

return Response(serializer_obj.data,status=status.HTTP_201_CREATED)

 

二、GenericAPIView

  • GenericAPIView是APIView的子类,具备APIView的所有功能
  • 往往需要指定queryset和serializer_class两个类属性
  • queryset指定当前类视图需要使用的查询集
  • serializer_class指定当前类视图需要使用的序列化器类 

 

import ast
import json

from django.http import HttpResponse, JsonResponse, Http404
from rest_framework.response import Response
from rest_framework import status
from django.views import View
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from .models import ProjectsModel
from django.db import connection
from .serializers import ProjectSerializer, ProjectModelSerializer, ProjectNameSerializer

# 能够动态的查询生成的sql语句
connection.queries


# Create your views here.


# class ProjectsDetailViews(APIView):
class ProjectsDetailViews(GenericAPIView):
    queryset = ProjectsModel.objects.all()
    serializer_class = ProjectModelSerializer

    def get(self, request, pk):
        pro = self.get_object()
        serializer_obj = self.serializer_class(instance=pro)
        return Response(serializer_obj.data, status=status.HTTP_200_OK)

    # 更新数据
    def put(self, request, pk):

        # 查出对应id的数据
        query_data = self.get_object()
        serializer_obj = self.serializer_class(instance=query_data, data=request.data)
        serializer_obj.is_valid()
        # 保存更新的数据
        serializer_obj.save()
        return Response(serializer_obj.data, status=status.HTTP_201_CREATED)

    # 删除数据
    def delete(self, request, pk):
        ret = {
            "msg": "删除成功!"
        }
        # 根据id查出对应数据
        query_data = self.get_object()
        # 删除指定数据
        query_data.delete()
        # 一般删除数据的输出为None
        return Response(ret,status=status.HTTP_204_NO_CONTENT)


# class ProjectsViews(APIView):
class ProjectsViews(GenericAPIView):
    queryset = ProjectsModel.objects.all()
    serializer_class = ProjectNameSerializer

    # 查询全部数据
    def get(self, request):
        # 往往不要直接使用queryset类属性,去获取查询集对象
        # 一般需要使用self.get_queryset(),去获取查询集对象,因为更加灵活,后续可以重写父类的get_queryset()
        pro_data = self.get_queryset()
        serializer_obj = self.get_serializer(instance=pro_data, many=True)
        return Response(serializer_obj.data, status=status.HTTP_200_OK)

    # 创建数据
    def post(self, request):

        serializer_obj = self.get_serializer(data=request.data)
        serializer_obj.is_valid(raise_exception=True)
        serializer_obj.save()
        return Response(serializer_obj.data, status=status.HTTP_201_CREATED)

 说明:文章来源地址https://www.toymoban.com/news/detail-534018.html

  1. 在上面代码中,代用父类的get_object()方法,不用再传递pk值,因为get_object()内部已经实现了处理查询集,lookup_field提取出所需要得pk值
  2. 在调用序列化器类传递data时,使用request.data获取到入参数据(继承APIView中的解析器)
  3. 在ProjectViews类方法中(get\post),往往不要直接使用queryset类属性,去获取查询集对象
    1. 一般需要使用self.get_queryset(),去获取查询集对象,因为更加灵活,后续可以重写父类的get_queryset()
    2. 调用self.get_serializer,获取序列化器类对象,原因同理

到了这里,关于【Django学习】(十一)APIView_请求与响应_GenericAPIView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Django学习】(十六)session_token认证过程与区别_响应定制

    【Django学习】(十六)session_token认证过程与区别_响应定制

    这里就直接引用别人的文章,不做过多说明 网络应用中session和token本质是一样的吗,有什么区别? - 知乎 在全局配置表中配置 rest_framework_jwt/views.py中 ​  查看ObtainJSONWebToken类: 发现里面引用了JSONWebTokenSerializer序列化器类 ​ users应用的url.py 引用obtain_jwt_token  发现rest_fra

    2024年02月15日
    浏览(12)
  • Django笔记四十一之Django中使用es

    前面在 Python 连接 es 的操作中,有过介绍如何使用 Python 代码连接 es 以及对 es 数据进行增删改查。 这一篇笔记介绍一下如何为 es 的 索引 index 定义一个 model,像 Django 里的 model 一样使用 es。 因为本篇笔记要介绍的内容是直接嵌入在 Django 系统使用,所以本篇笔记直接归属于

    2024年02月07日
    浏览(9)
  • web应用模式、API接口、接口测试工具postman、如何在浏览器中测试、restful规范、序列化反序列化、基于Django原生编写五个接口、drf介绍和快速使用、drf之APIView源码分析

    web应用模式、API接口、接口测试工具postman、如何在浏览器中测试、restful规范、序列化反序列化、基于Django原生编写五个接口、drf介绍和快速使用、drf之APIView源码分析

    目录 一、web应用模式 二、API接口 三、接口测试工具postman postman介绍 postman下载与使用 四、如何在浏览器中测试 五、restful规范(重要) 六、序列化反序列化 七、基于Django原生编写五个接口 八、drf介绍和快速使用 概念 特点(了解一下) 安装 使用drf编写五个接口 九、drf之API

    2024年02月05日
    浏览(19)
  • 第十一章 请求响应

    第十一章 请求响应

    将前端发送的请求封装为HttpServletRequest对象 在通过HttpServletResponse 在前后端分离开发中,后端每开发完一个功能,就想要对这个接口功能进行测试 由于是前后端分离开发,所以没有前端页面 我们一般是在浏览器中直接输入地址,来访问我们所开发的web应用 但是浏览器发起的

    2024年01月21日
    浏览(17)
  • Django模板加载与响应

    Django模板加载与响应

    Django 的模板系统将 Python 代码与 HTML 代码解耦,动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎,但是通常使用 Django 的模板系统时,应该首先考虑其内置的后端 DTL(Django Template Language,Django 模板语言。 在 Django 中,模板是可以根据字典数据动态变化的,并且

    2024年02月07日
    浏览(10)
  • Django笔记三十一之全局异常处理

    Django笔记三十一之全局异常处理

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十一之全局异常处理 这一篇笔记介绍 Django 的全局异常处理。 当我们在处理一个 request 请求时,会尽可能的对接口数据的格式,内部调用的函数做一些异常处理,但可能还是会有一些意想不到的漏网之鱼,造成程序的异常

    2023年04月26日
    浏览(10)
  • Nodejs 第三十一章(响应头和请求头)

    Nodejs 第三十一章(响应头和请求头)

    响应头 HTTP响应头(HTTP response headers)是在HTTP响应中发送的元数据信息,用于描述响应的特性、内容和行为。它们以键值对的形式出现,每个键值对由一个标头字段(header field)和一个相应的值组成。 例如以下示例 响应头和跨域之间的关系 cors 跨域资源共享(Cross-Origin Res

    2024年01月16日
    浏览(13)
  • python django StreamingHttpResponse流式响应中文是乱码

    在 Django 中,StreamingHttpResponse 用于实现流式响应,即在响应过程中逐步发送数据。如果在使用 StreamingHttpResponse 时,返回的中文内容出现乱码,可能是因为编码设置不正确。 要解决这个问题,请确保在设置 StreamingHttpResponse 时,正确设置了字符编码。以下是一个示例: 在这个

    2024年03月10日
    浏览(12)
  • Django笔记二十一之使用原生SQL查询数据库

    Django笔记二十一之使用原生SQL查询数据库

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十一之使用原生SQL查询数据库 Django 提供了两种方式来执行原生 SQL 代码。 一种是使用 raw() 函数,一种是 使用 connection.cursor()。 但是官方还是推荐在使用原生 SQL 之前,尽量的先去探索一下 QuerySet 提供的各种 API。 目前而言

    2023年04月10日
    浏览(48)
  • Django请求的生命周期

    Django请求的生命周期

    Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后,首先会基于http协议去解析数据并

    2024年02月10日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包