八、Drf解析器

news2024/11/25 16:44:47

八、解析器

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 DefaultContentNegotiation

class LoginView(MyAPIView):
    #用户登入,不需要认证,不需要任何权限
    authentication_classes = []
    permission_classes = []
    #加载所有的解析器
    parser_classes=[JSONParser,FormParser]
    #根据请求类型,匹配对应的解析器
    content_negotiation_class=DefaultContentNegotiation
    def 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 DefaultContentNegotiation




class LoginView(MyAPIView):
    #用户登入,不需要认证,不需要任何权限
    authentication_classes = []
    permission_classes = []
    #加载所有的解析器(增加一个文件解析器,FileUploadParser)
    parser_classes=[JSONParser,FormParser,FileUploadParser]
    #根据请求类型选择对应的解析器
    content_negotiation_class=DefaultContentNegotiation
    def 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=DefaultContentNegotiation
    def 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.coloradmin.cn/o/2190540.html

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

相关文章

数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)

数据库管理247期 2024-10-04 数据库管理-第247期 23ai&#xff1a;全球分布式数据库-Schema对象&#xff08;20241004&#xff09;1 分区、表空间和Chunk&#xff08;块&#xff09;2 表空间组3 分片表4 分片表族5 复制表6 在所有分片上创建的非表对象总结 数据库管理-第247期 …

C++——模板进阶、继承

文章目录 一、模板1. 非类型模板参数2. 模板的特化函数模板特化类模板特化1. 全特化2. 偏特化部分特化参数更进一步的限制 二、继承1. 概念2. 定义定义格式 3. 继承基类成员访问⽅式的变化4. 继承类模板5.基类和派⽣类间的转换6. 继承中的作⽤域隐藏规则&#xff1a; 7. 派⽣类…

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

阳台山足球营地的停车位探寻

阳台山足球营地的环境是真好哈。停车场名称&#xff1a;阳台山森林公园配套停车场。应该很多爬山的人车子也停在这里。而且我没想到的&#xff0c;阳台山的山泉水还有不少居民每天提着空桶去山上装。看来环境是真的很好哈 停车场有地面和地下停车场&#xff0c;停车位个数查不…

Linux驱动开发(速记版)--设备模型

第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备&#xff0c;但对于电源管理和热插拔&#xff0c;不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系&#xff0c;提供API处理设备…

若依使用(二次开发)

RouYi-MT RouYi-MT下载&#xff1a; 下载地址 RouYi-MT的使用&#xff08;修改若依代码中文件夹得统一包名&#xff09; 将对应的Springboot文件压缩成压缩包。 填写对应的参数&#xff0c;生成修改后的文件。 开发步骤 1.创建子项目到RouYi-springboot中&#xff0c;添加…

简单易懂的springboot整合Camunda 7工作流入门教程

简单易懂的Spring Boot整合Camunda7入门教程 因为关于Spring Boot结合Camunda7的教程在网上比较少&#xff0c;而且很多都写得有点乱&#xff0c;很多概念写得太散乱&#xff0c;讲解不清晰&#xff0c;导致看不懂&#xff0c;本人通过研究学习之后就写出了这篇教学文档。 介…

我的创作纪念日一年

目录 机缘 收获 日常 成就 憧憬 机缘 我之所以开始写CSDN博客&#xff0c;源于一段特殊的时光。去年此时&#xff0c;我独自待在实验室&#xff0c;周围的世界仿佛与我无关。没有旅游&#xff0c;没有与朋友的欢聚&#xff0c;情感的挫折和学业的压力如潮水般袭来。在这样的…

2025舜宇招聘【内推码】

【2025内推码】 DSwNQ9yu DSJXN8Mr 舜宇集团2025届全球校园招聘正式启动&#xff01;&#xff01;&#xff01; 专业需求&#xff1a;机械、自动化、电子、电气、通信、控制、测控、计算机、软件、物理、光学等专业&#xff1b; 工作地点&#xff1a;宁波余姚、浙江杭州、广东…

97. UE5 GAS RPG 实现闪电链技能(二)

书接上回&#xff0c;如果没有查看上一篇文章的同学推荐先看上一章&#xff0c;我们接着实现闪电链技能。 在上一章最后&#xff0c;我们实现了闪电链的第一条链&#xff0c;能够正确显示特效&#xff0c;接下来&#xff0c;我们先实现它的音效和一些bug修复。 我们在多端网络里…

(9)MATLAB瑞利衰落信道仿真2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、瑞利衰落信道二、瑞利衰落信道建模三、仿真结果二、高斯随机变量和瑞利随机变量后续 前言 本文首先给出瑞利衰落信道模型&#xff0c;并根据瑞利衰落变量估…

乌班图基础设施安装之Mysql8.0+Redis6.X安装

简介&#xff1a;云服务器基础设施安装之 Mysql8.0Redis6.X 安装 Docker安装 # 按照依赖 yum install -y yum-utils device-mapper-persistent data lvm2 Docker Mirror 从去年开始. hub.docker.com[1] 在国内的访问速度极慢. 当时大家主要还是依赖国内的一些镜像源: 如中科…

【JNI】数组的基本使用

在上一期讲了基本类型的基本使用&#xff0c;这期来说一说数组的基本使用 HelloJNI.java&#xff1a;实现myArray函数&#xff0c;把一个整型数组转换为双精度型数组 public class HelloJNI { static {System.loadLibrary("hello"); }private native String HelloW…

AI编程工具的崛起:效率提升的未来在哪里?

你正在使用的编程工具会被淘汰吗&#xff1f;AI编程工具正在改变这一切&#xff01; 在日益忙碌的开发世界里&#xff0c;工具的选择决定了开发者的工作效率。在过去的十年里&#xff0c;从代码编辑器到版本控制工具&#xff0c;各种工具帮助开发者逐步优化了工作流程&#xf…

C/C++逆向:函数逆向分析-调用约定分析

在进行函数逆向分析时&#xff0c;分析其函数调用约定具有非常重要的作用&#xff0c;因为调用约定直接影响了函数的参数传递、返回值、栈管理、寄存器使用等多个方面&#xff0c;不同的编译器和平台可能有不同的默认调用约定&#xff0c;识别调用约定可以帮助判断代码是由哪种…

HTB:Mongod[WriteUP]

连接至HTB服务器并启动靶机 靶机IP&#xff1a;10.129.99.33 分配IP&#xff1a;10.10.16.12 1.How many TCP ports are open on the machine? 使用nmap对靶机进行全端口TCP脚本、服务扫描&#xff1a; nmap -sC -sV -T4 -p- {TARGET_IP} 可以看到靶机共开放TCP端口2个&…

LC108-将有序数组转化为二叉搜索树(二叉平衡树)

文章目录 1 题目2 思路3 ACM完整代码参考 1 题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树 示例&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1…

最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )

Openai 上线语音模型whisper-large-v3-turbo 在本文中&#xff0c;我们将介绍 whisper-large-v3-turbo 以及 whisper-web&#xff08;一个直接在浏览器中进行ML语音识别的开源项目&#xff09;。 尽管近年来出现了许多音频和多模态模型&#xff0c;但Whisper 仍是生产级自动语音…

类型模板参数与非类型模板参数

在C中&#xff0c;模板参数分为两种类型&#xff1a;类型参数和非类型参数。类型参数是指定模板类型名称的参数&#xff0c;而非类型参数是指定模板整型常量的参数。 模板参数不限定于类型&#xff0c;普通值也可作为模板参数&#xff0c;但这里值的类型只能是整形家族&#x…

Qt教程(001):Qt概述与安装

文章目录 一、Qt概述1.1 什么是Qt1.2 Qt优点1.3 Qt发展史1.4 支持的平台1.5 成功案例1.6 下载安装1.7 QtCreator介绍 一、Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的&…