Django REST Framework(四)DRF APIVIEW

REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。

REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。

Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。

  • 常用属性

    • .data
      • request.data 返回解析之后的请求体数据。类似于Django中标准的request.POST
      • request.FILES属性,但提供如下特性:
      • 包含了解析之后的文件和非文件数据

      • 包含了对POST、PUT、PATCH请求方式解析后的数据

      • 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据

    • request._request
      • 获取django封装的Request对象
    • .query_params
      • request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。

  • 基本使用

    • 视图代码:
      from django.views import View
      from django.http.response import HttpResponse
      from django.http.request import HttpRequest
      from django.core.handlers.wsgi import WSGIRequest
      class ReqView(View):def get(self,request):print(request)return HttpResponse("ok")"""
      默认情况下, 编写视图类时,如果继承的是django内置的django.view.View视图基类,
      则视图方法中得到的request对象,是django默认提供的django.core.handlers.wsgi.WSGIRequest
      WSGIRequest这个请求处理对象,无法直接提供的关于json数据数据处理。
      在编写api接口时很不方便,所以drf为了简写这块内容,在原来的HttpRequest的基础上面,新增了一个Request对象
      这个Request对象是单独声明的和原来django的HttpRequest不是父子关系。
      同时注意:要使用drf提供的Request请求处理对象,必须在编写视图类时继承drf提供的视图基类from rest_framework.views import APIView如果使用drf提供的视图基类APIView编写类视图,则必须使用来自drf提供的Request请求对象和Response响应对象
      """
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import status
      class ReqAPIView(APIView):def get(self,request):# rest_framework.request.Request对象print(request) # <rest_framework.request.Request: GET '/req/req2?name=xiaoming&age=17&lve=swim&lve=code'># 获取查询字符串print(request.query_params)# 没有参数情况下: <QueryDict: {}># 有参数的情况下: <QueryDict: {'name': ['xiaoming'], 'age': ['17'], 'lve': ['swim', 'code']}># 所以,request.query_params的返回值操作和原来在django里面是一模一样的print(request.query_params.get("name")) # xiaomingprint(request.query_params.getlist("lve")) # ['swim', 'code']return Response("ok")def post(self, request):# 获取请求体print(request.data) # {'name': 'xiaoming', 'age': 16, 'lve': ['swim', 'code']}"""直接从请求体中提取数据转# 客户端如果上传了json数据,直接返回字典{'name': '灰太狼', 'age': 20, 'sex': 1, 'classmate': '301', 'description': '我还会再回来的~'}# 客户端如果上传了表单数据,直接返回QueryDict<QueryDict: {'name': ['xiaohui'], 'age': ['18']}>"""print(request.FILES) # 获取上传文件列表# 要获取django原生提供的HttpRequest对象,可以通过request._request来获取到print(request._request.META.get("Accept")) # 当值为None时,drf默认在响应数据时按json格式返回# response = Response(data="not ok", status=204, headers={"Company":"Oldboy"})response = Response(data="not ok", status=status.HTTP_400_BAD_REQUEST, headers={"Company":"Oldboy"})return response

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染器)成符合前端需求的类型。

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

可以在rest_framework.settings查找所有的drf默认配置项

REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类'rest_framework.renderers.JSONRenderer',  # json渲染器,返回json数据'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览器API渲染器,返回调试界面)
}

 

构造方式
Response(data, status=None, template_name=None, headers=None, content_type=None)

drf的响应处理类和请求处理类不一样,Response就是django的HttpResponse响应处理类的子类。

data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器处理data

data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)再传递给data参数。

参数说明:  

  • data: 为响应准备的序列化处理后的数据;

  • status: 状态码,默认200;

  • template_name: 模板名称,如果使用HTMLRenderer 时需指明;

  • headers: 用于存放响应头信息的字典;

  • content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数

7response对象的属性

.data:传给response对象的序列化后,但尚未render处理的数据

.status_code:状态码的数字

.content:经过render处理后的响应数据

 状态码

为了方便设置状态码,REST framewrok在rest_framework.status模块中提供了常用http状态码的常量。

# 1)信息告知 - 1xx
HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS# 2)成功 - 2xx
HTTP_200_OK
HTTP_201_CREATED
HTTP_202_ACCEPTED
HTTP_203_NON_AUTHORITATIVE_INFORMATION
HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS# 3)重定向 - 3xx
HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT# 4)客户端错误 - 4xx
HTTP_400_BAD_REQUEST
HTTP_401_UNAUTHORIZED
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN
HTTP_404_NOT_FOUND
HTTP_405_METHOD_NOT_ALLOWED
HTTP_406_NOT_ACCEPTABLE
HTTP_407_PROXY_AUTHENTICATION_REQUIRED
HTTP_408_REQUEST_TIMEOUT
HTTP_409_CONFLICT
HTTP_410_GONE
HTTP_411_LENGTH_REQUIRED
HTTP_412_PRECONDITION_FAILED
HTTP_413_REQUEST_ENTITY_TOO_LARGE
HTTP_414_REQUEST_URI_TOO_LONG
HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS# 5)服务器错误 - 5xx
HTTP_500_INTERNAL_SERVER_ERROR
HTTP_501_NOT_IMPLEMENTED
HTTP_502_BAD_GATEWAY
HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop权威指南-读书笔记-03-Hadoop分布式文件系统

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈&#x1f601;有兴趣的小伙伴可以去看看原著&#x1f60a; 第三章 Hadoop分布式文件系统 当数据集的大小超过一台独立的物理计算机的存储能力时&#xff0c;就有必要对它进行分…

【数据结构】(C语言):二叉搜索树(不使用递归)

二叉搜索树&#xff1a; 非线性的&#xff0c;树是层级结构。基本单位是节点&#xff0c;每个节点最多2个子节点。有序。每个节点&#xff0c;其左子节点都比它小&#xff0c;其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。 …

CAS(比较与交换)实现原理

CAS&#xff08;Compare and Swap&#xff0c;即比较并交换&#xff09;是一种用于多线程编程中无锁原子操作的机制&#xff0c;常用于实现并发数据结构和算法。CAS 操作通过硬件支持的原子操作实现&#xff0c;可以避免锁带来的开销&#xff0c;提高并发性能。以下是CAS实现原…

选择远程调用的底层实现技术

(1)、 理论基础 feign的远程调用底层实现技术默认采用的是JDK的 URLConnection&#xff0c;同时还支持 HttpClient与 OKHttp。 由于JDK的URLConnection不支持连接池&#xff0c;通信效率很低&#xff0c;所以生产中是不会使用该默认实现的。所以在SpringCloudOpenFeign中直接将…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

前端面试题5(http与https区别)

http与https区别 **HTTP&#xff08;Hypertext Transfer Protocol&#xff09;与HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;**是两种用于在互联网上传输数据的协议&#xff0c;它们有以下主要区别&#xff1a; 安全性&#xff1a; HTTP&#xff1a;HTT…

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果&#xff0c;但是对应的时间戳往往不准确&#xff0c;而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外&#xff0c;他们在处理长音频时通过缓冲转录

「C++系列」C++ 变量作用域

文章目录 一、C 变量作用域二、局部变量三、全局变量四、类作用域五、相关链接 一、C 变量作用域 在C中&#xff0c;变量的作用域&#xff08;Scope&#xff09;指的是变量在程序中可以被访问的区域。作用域由花括号{}定义&#xff0c;这些花括号可以出现在函数体、控制结构&a…

Apipost接口测试工具的原理及应用详解(四)

本系列文章简介&#xff1a; 随着软件行业的快速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为不同软件组件之间通信的桥梁&#xff0c;其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此&#xff0c;对API进行严格的测试成为…

windows安装jdk21

下载 下载zip解压 设置环境变量 设置JAVA_HOME环境变量 Path环境变量添加如下值%HAVA_HOME%\bin 打开新的cmd&#xff0c;输入java --version查看效果

恒创科技:HTTP错误码403禁止意味着什么,怎么修复它?

HTTP错误码403禁止意味着客户端无权访问特定网页或服务器。403 错误表示客户端存在问题&#xff0c;无论用户使用的是哪种网络浏览器&#xff0c;都可能发生这种情况。幸运的是&#xff0c;阻止服务器允许访问特定页面的问题通常可以修复。以下是一些常见原因和相应的解决方案。…

【ROS2】Ubuntu 24.04 源码编译安装 Jazzy Jalisco

目录 系统要求 系统设置 设置区域启用所需的存储库安装开发工具 构建 ROS 2 获取 ROS 2 代码使用 rosdep 安装依赖项安装额外的 RMW 实现&#xff08;可选&#xff09;在工作区构建代码 设置环境 尝试一些例子 下一步 备用编译器 Clang保持最新状态 故障排除 卸载 系统要求 当前…

滤波算法学习笔记

目录 引言 一、定义 二、分类 三、常见滤波算法 四、应用与优势 五、发展趋势 例程 1. 均值滤波&#xff08;Moving Average Filter&#xff09; 2. 中值滤波&#xff08;Median Filter&#xff09; 3. 高斯滤波&#xff08;Gaussian Filter&#xff09; 4.指数移动…

CSS 原生嵌套语法兼容性问题

目录 1.介绍2.兼容性问题 1.介绍 所谓的嵌套&#xff0c;就是将一个 CSS 规则放在另一个&#xff08;嵌套规则&#xff09;中&#xff0c;子规则的选择器将相对于父规则的选择器。这有利于代码的模块化和可维护性。原来只能在 CSS 预处理器Less、Sass中使用的嵌套功能&#xf…

Map进行自定义排序

在Java中&#xff0c;Map 接口本身并不提供自定义排序的功能。Map 接口的实现类 HashMap、LinkedHashMap 和 TreeMap 提供了不同的排序特性&#xff1a; HashMap&#xff1a;不保证元素的顺序&#xff0c;元素的插入顺序可能会在遍历时被随机打乱。LinkedHashMap&#xff1a;类…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解决 &#xff08…

《Winodws API每日一练》8.2 static控件

在 Windows 编程中&#xff0c;"Static" 控件是一种常见的用户界面元素&#xff0c;用于显示静态文本或图像&#xff0c;而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素&#xff0c;不接受用户的…

秒懂设计模式--学习笔记(6)【创建篇-建造者模式】

目录 5、建造者模式5.1 介绍5.2 建造步骤的重要性5.3 地产开发商的困惑5.4 建筑施工方5.5 工程总监5.6 项目实施5.7 建造者模式的各角色定义5.8 建造者模式 5、建造者模式 5.1 介绍 建造者模式&#xff08;Builder&#xff09;又称为生成器模式&#xff0c;主要用于对复杂对象…

Pip的缓存机制解析:提升Python包管理效率的秘密武器

Pip的缓存机制解析&#xff1a;提升Python包管理效率的秘密武器 Pip是Python的包管理工具&#xff0c;用于安装和管理Python库。从pip 20.3版本开始&#xff0c;引入了一项重要的特性——缓存机制。这一机制显著提升了包安装的速度和效率&#xff0c;尤其是在网络条件不佳或需…

爬虫-豆瓣电影排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…