八、Drf解析器

八、解析器

8.1概念

解析用户请求发送过来的数据(常用的是JSON)

请求类型:

get:

​ 方式1: http://127.0.0.1/web/?arg1=v1&arg2=v2

​ 方式2:通过请求头发送

post:

​ 请求头:

​ content-type:“urlencode…”

​ content-type:“application/json”

​ 请求体:

​ arg1=v1&arg2=v2

​ {‘arg1’:'v1,‘arg2’:‘v2’}

8.2解析流程

1)读取请求头

2)根据请求头解析数据

​ --根据请求头获取解析器 -->如Json解析器

​ --request.data=解析器.parse

3)得到request.data

8.3简单应用

#视图类
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser,FormParser
from rest_framework.negotiation import DefaultContentNegotiationclass LoginView(MyAPIView):#用户登入,不需要认证,不需要任何权限authentication_classes = []permission_classes = []#加载所有的解析器parser_classes=[JSONParser,FormParser]#根据请求类型,匹配对应的解析器content_negotiation_class=DefaultContentNegotiationdef post(self,request):# name=request.data.get('name')# password=request.data.get('password')print(request.data)return Response('success')

1)使用postman以JSON形式发送请求
在这里插入图片描述

输出:

{'name': 'sally', 'password': '123456'}

2)使用postman以x-www-form-urlencoded形式发送请求

在这里插入图片描述

输出:

<QueryDict: {'name': ['sally'], 'password': ['123456']}>

8.4使用postman上传文件

#视图类
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning
from rest_framework.versioning import URLPathVersioning
from rest_framework.versioning import AcceptHeaderVersioning
from rest_framework.parsers import JSONParser,FormParser,FileUploadParser
from rest_framework.negotiation import DefaultContentNegotiationclass LoginView(MyAPIView):#用户登入,不需要认证,不需要任何权限authentication_classes = []permission_classes = []#加载所有的解析器(增加一个文件解析器,FileUploadParser)parser_classes=[JSONParser,FormParser,FileUploadParser]#根据请求类型选择对应的解析器content_negotiation_class=DefaultContentNegotiationdef post(self,request):# name=request.data.get('name')# password=request.data.get('password')print('content_type:',request.content_type)print('request.data',request.data)#获取request.data中的文件对象file_obj=request.data.get('file')print('file_name:',file_obj.name)with open(file_obj.name,'wb') as target_file_obj:#将用户上付的文件写入新文件for chunk in file_obj:target_file_obj.write(chunk)file_obj.close()return Response('success')

使用postman上传文件

在postman中添加一个请求头

Content-Disposition:form-data; name=“file”; filename=“django.png”

在这里插入图片描述

上传文件

在这里插入图片描述

输出:

content_type: image/png
#request.data中会有一个文件对象
request.data {'file': <InMemoryUploadedFile: django.png (image/png)>}
file_name: django.png

8.5、MultiPartParser解析器

当请求中既有普通数据又有文件时,可以使用MultiPartParser解析器

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser,FormParser,FileUploadParser,MultiPartParser
from rest_framework.negotiation import DefaultContentNegotiation# Create your views here.class LoginView(MyAPIView):#用户登入,不需要认证,不需要任何权限authentication_classes = []permission_classes = []#加载所有的解析器parser_classes=[MultiPartParser,]#根据请求类型选择对应的解析器content_negotiation_class=DefaultContentNegotiationdef post(self,request):# name=request.data.get('name')# password=request.data.get('password')print('content_type:',request.content_type)print('request.data',request.data)file_obj=request.data.get('file')print('file_name:',file_obj.name)with open(file_obj.name,'wb') as target_file_obj:for chunk in file_obj:target_file_obj.write(chunk)file_obj.close()return Response('success')

在这里插入图片描述

输出:

content_type: multipart/form-data; boundary=--------------------------970019987472571630217583
#request.data中既有普通数据,又有文件
request.data <QueryDict: {'name': ['sally'], 'password': ['123456'], 'file': [<InMemoryUploadedFile: django.png (image/png)>]}>
file_name: django.png

8.6默认解析器

在视图类中默认解析器

print(self.parser_classes)

输出:

[<class 'rest_framework.parsers.JSONParser'>, <class 'rest_framework.parsers.FormParser'>, <class 'rest_framework.parsers.MultiPartParser'>]

所以drf默认的解析器就是JSONParse,FormParser和MultiPartParser

8.7解析器的全局配置

REST_FRAMEWORK = {    'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser'],
}

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

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

相关文章

dbeaver的使用

新增mysql连接 新增clickhouse 连接 新建编辑器 执行 结果&#xff0c;想看某条结果明细&#xff0c;选中某行安tab键 设置快捷键 窗口-》首选项-》用户界面-》键

论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

这篇论文研究了使用提示 (Prompting) 方法微调预训练语言模型&#xff0c;以提高其在对抗样本攻击下的鲁棒性。论文的主要贡献如下&#xff1a; 1.MVP 比 MLP-FT 更鲁棒&#xff1a; 论文比较了 MVP (Model-tuning Via Prompts) 和传统的 MLP-FT (Fine-tuning with an MLP head…

①EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 ModbusTCP GW系列型号 MS-GW15 简介 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 …

vscode环境迁移

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 vscode环境迁移 Setting 即可打开settings.json {"python.pythonPath": "/Users/apple/opt/anaconda3/bin/python","cmake.cmakePath": "/usr/local/bin/cmake",&qu…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  …

pytest(三)——参数化@pytest.mark.parametrize

目录 前言 参数化场景 实际Web UI自动化中的开发场景&#xff0c;比如是一个登录框 parametrize单参数 “笛卡尔积”&#xff0c;多个参数化装饰器 重点知识 参考文献 前言 pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures pytest_generate_tests 允…

CTFshow 命令执行 web29~web36(正则匹配绕过)

目录 web29 方法一&#xff1a;include伪协议包含文件读取 方法二&#xff1a;写入文件 方法三&#xff1a;通识符 web30 方法一&#xff1a;filter伪协议文件包含读取 方法二&#xff1a;命令执行函数绕过 方法三&#xff1a;写入文件 web31 方法一&#xff1a;filter伪…

SpringCloud Alibaba - Eureka注册中心,Nacos配置中心

Eureka 1、创建服务端 server:port: 8761 # eureka 默认端口spring:application:name: eureka-server # 应用名称&#xff08;微服务中建议必须定义应用名称&#xff09; SpringBootApplication EnableEurekaServer // 开启eureka注册中心功能 public class EurekaServerAppli…

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

目录 1 什么是枚举 2 定义枚举类型 2.1 语法格式 2.2 枚举元素的特点 2.3 案例演示 3 枚举变量 3.1 什么是枚举变量 3.2 定义枚举变量的多种方式 3.3 案例演示 1&#xff1a;标准版枚举类型 3.4 案例演示 2&#xff1a;简化版枚举类型 3.5 案例演示 3&#xff1a;匿…

RTR_Chapter_6 下

程序化纹理 上文所提到的方法&#xff0c;都是给定一个纹理空间中的坐标位置&#xff0c;然后在图像中进行查找&#xff0c;从而获得纹理值。还有一种方法是对函数进行求值&#xff0c;然后作为对应位置上的纹理值&#xff0c;这就是程序化纹理&#xff08;procedural texture&…

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…

使用TM1618控制LED了解P-MOS和N-MOS的开漏输出的不同

数据手册上的截取内容 手册中推荐的共阴/阳极电路 可以发现GRID总接LED的负极&#xff0c;SEG引脚接的是LED 正极 分析输出的MOS管类型可以很好的知道原因 图片来源 通过都是开漏输出可以看出&#xff0c;引脚引出的内部电路是不同的。P-mos引出的是漏极&#xff0c;导通时…

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库&#xff0c;专为简化在分布式环境中的Java开发而设计。通过Redisson&#xff0c;开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象&#xff0c;并处理各种分布式场景的挑战。 Redisson的设计灵感来…

软考鸭微信小程序:助力软考备考的便捷工具

一、软考鸭微信小程序的功能 “软考鸭”微信小程序是一款针对软考考生的备考辅助工具&#xff0c;提供了丰富的备考资源和功能&#xff0c;帮助考生提高备考效率&#xff0c;顺利通过考试。其主要功能包括&#xff1a; 历年试题库&#xff1a;小程序内集成了历年软考试题&…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下&#xff0c;国内旅游更是呈现出蓬勃的发展态势。中国&#xff0c;这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地&#xff0c;为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力&#xff0c;深入剖…

Java.数据结构.HashMap

目录 1基本概念 2数据结构 3常用操作 3.1 put(K key, V value)&#xff1a;插入键值对。 3.2 get(Object key)&#xff1a;根据键获取值。 3.3 remove(Object key)&#xff1a;移除键值对。 3.4 containsKey(Object key)&#xff1a;判断Map中是否包含指定的键。 3.5 c…

Android Camera2 与 Camera API技术探究和RAW数据采集

Android Camera2 Android Camera2 是 Android 系统中用于相机操作的一套高级应用程序接口&#xff08;API&#xff09;&#xff0c;它取代了之前的 Camera API。以下是关于 Android Camera2 的一些主要信息&#xff1a; 主要特点&#xff1a; 强大的控制能力&#xff1a;提供…

神秘的二叉树

一.什么是树 都说艺术来源于生活&#xff0c;技术同样也是来源于生活。什么是树&#xff0c;它是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

VUE2常见问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 row-click 事件与行内点击事件冲突&#xff0c;点击事件不生效&#xff08;表格行点击事件和行内元素点击事件冲突&#xff09;需要阻止事件冒泡 问题描述 1.点击列的编辑按钮&#xff0c;会触发按钮本身事件&#xff0c;同时会触发行点击事件 2.点…