django中如何解析content-type=application/json的请求

django中如何解析content-type=application/json的请求

在这里插入图片描述

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

往期文章回顾:

  • 12.实测DeepSeek分词机制:你的输入如何变成计费Token? @2025-06-08 19:30:43+08:00
  • 11.英语分词进化论:BPE相关论文汇总 @2025-06-08 18:43:38+08:00
  • 10.硬核实战 | 3分钟Docker部署ClickHouse列存数据库 @2025-06-07 20:14:33+08:00
  • 9.技术深解 | DeepSeek-R1-0528训练参数全透视:163K上下文与MoE高效架构的基石 @2025-06-07 19:23:40+08:00
  • 8.DeepSeek最新升级实测:推理能力翻倍,但离世界顶尖还有多远? @2025-06-06 23:35:19+08:00
  • 7.血泪教训!Redis默认配置竟会导致数据丢失?Docker生产部署指南 @2025-06-06 00:00:00+08:00
  • 6.Function Call:大模型如何突破自身局限“使用工具“ @2025-06-05 23:57:45+08:00
  • 5.DeepSeek动手实践:创建一个自动连点器 @2025-06-04 23:59:15+08:00
  • 4.告别无效提示!使用少样本学习让AI秒懂你的需求 @2025-06-03 23:46:56+08:00
  • 3.解密PromptTemplate:为什么说它是AI时代的Jinja模板? @2025-06-02 21:47:23+08:00
  • 2.LangChain Core架构解析:模块化设计与LCEL原语实现原理 @2025-06-01 21:02:36+08:00
  • 1.拒绝重复造轮子!LangChain如何简化LLM应用开发? @2025-06-01 07:42:09+08:00

问题描述

主要问题

Django原生开发时,View视图里POST请求处理方法post里通过request.POST获取content-type=application/json类型的请求的请求体的结果为空字典{}

其他观察

  • 对于content-type=application/x-www-form-urlencoded类型的请求体能正常解析

  • 对于content-type=application/json类型的请求,调试发现request.body里包含请求的json字符串

  • 处理视图View的入参request的类型是django.core.handlers.wsgi.WSGIRequest

原因分析

综合分析上述问题和观察结果,猜测django在解析请求的时候根据content-type做了特殊区分处理

分析django源码,发现request.POST实际上是个property(POST = property(_get_post, _set_post))。
具体逻辑如下:

    def _get_post(self):if not hasattr(self, '_post'):self._load_post_and_files()return self._postdef _set_post(self, post):self._post = post

而上述问题是查询的时候无法获取,因此继续跟踪_get_post方法,_load_post_and_files就是加载和解析post请求参数的主要逻辑,继承自django.http.request.HttpRequest
具体逻辑如下

    def _load_post_and_files(self):"""Populate self._post and self._files if the content-type is a form type"""if self.method != 'POST':self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()returnif self._read_started and not hasattr(self, '_body'):self._mark_post_parse_error()returnif self.content_type == 'multipart/form-data':if hasattr(self, '_body'):# Use already read datadata = BytesIO(self._body)else:data = selftry:self._post, self._files = self.parse_file_upload(self.META, data)except MultiPartParserError:# An error occurred while parsing POST data. Since when# formatting the error the request handler might access# self.POST, set self._post and self._file to prevent# attempts to parse POST data again.# Mark that an error occurred. This allows self.__repr__ to# be explicit about it instead of simply representing an# empty POSTself._mark_post_parse_error()raiseelif self.content_type == 'application/x-www-form-urlencoded':self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict()else:self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()

通过分析不难发现仅仅解析如下content-type的请求体

  • multipart/form-data- 也就是文件上传
  • application/x-www-form-urlencoded
  • 其他类型 - 返回空字典(这也就解释了为啥content-type=application/json时获取的是个空字典)

解决方案

当抽丝剥茧找到问题的根本原因时,解决方案也就来了,那就是 自己解析 😂,当然你也可以投入djangorestframework的怀抱,这是后话。

在构造form表单参数验证前,根据request.content_type == 'application/json'条件判断,满足的进行json字符串解析即可

方案示例

def post(self, request, *args, **kwargs):if request.content_type == 'application/json':# 这里可以增加一些异常处理逻辑body = json.loads(request.body)else:body = request.POST# 创建form表单form = CustomForm(body).... # 后续处理

One More Thing

授人以鱼不如授人以渔,本文以Django中POST请求处理时无法通过request.POST直接获取content-type=application/json的请求体的问题为例,系统地展示在Django开发中遇到问题时,该如何从现象排查、问题定位、原因分析到最终解决的完整方法论。

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

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

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

相关文章

Chainlink VRF 深度解析与实战

背景 在区块链的去中心化应用中,随机性是一个常见但难以实现的需求。例如,区块链游戏需要随机决定战斗结果,NFT 项目需要随机分配稀有属性,去中心化抽奖需要公平选择获奖者。然而,传统的链上随机数生成方法&#xff0…

7. TypeScript接口

TypeScript 中的接口(Interfaces)用于定义对象的结构。它们允许开发者指定一个对象应具有哪些属性以及这些属性的类型。接口有助于确保对象遵循特定的结构,从而在整个应用中提供一致性,并提升代码的可维护性。 一、认识接口 Typ…

UE 新版渲染器输出视频

安装包解压到C盘 打开UE插件 Movie Render Queue 进入UE引擎在项目设置找到 libx264 aac mp4 影片渲染队列调用出 命令行编码器安装包路径,序列输出路径,定序器不能有中文

基于用户的协同过滤推荐算法实现(Java电商平台)

在电商平台中,基于用户的协同过滤推荐算法是一种常见的推荐系统方法。它通过分析用户之间的相似性来推荐商品。以下是一个简单的实现思路和示例代码,使用Java语言。 实现思路 数据准备:收集用户的评分数据,通常以用户-商品评分矩…

LeetCode - 904. 水果成篮

题目 904. 水果成篮 - 力扣(LeetCode) 思路 题目本质 你有一个整数数组,每个元素代表一种水果。你只能用两个篮子,每个篮子只能装一种水果。你要在数组中找一个最长的连续子数组,这个子数组里最多只包含两种不同的…

发现 Kotlin MultiPlatform 的一点小变化

最近发现 Kotlin 官方已经开始首推 Idea 的社区版的 KMP 插件了. 以前有网页创建 KMP 的项目的文档也消失了. 虽然有 Android Studio 的选项. 但是却不是在默认的位置上了. 足以说明官方是有意想让大家直接使用 Idea 社区版或者专业版 所以我直接在社区版上安装 KMP 插件. 尝试…

【Photoshop】金属字体制作

新建一个空白项目,选择横排文字工具,输入想要的文件建立文字图层 选择横排文字工具选择出文字内容,在通知栏出点击’拾色器‘,设置好需要的文字颜色 图层面板右下角点击‘添加图层样式’,选择斜面和浮雕 样式设置为内斜…

centos 7.9 升级ssh版本 7.4p1 升级到 8.2p1

centos 7.9 升级ssh版本 7.4p1 升级到 8.2p1 1、安装包下载2、安装telnet3、安装openssl-OpenSSL_1_1_1f.tar.gz4、安装openssh-8.2p1.tar.gz5、修改ssh服务的相关配置文件6、确定可以ssh连接服务器后,卸载telnet,因为telnet不安全 本文是离线环境下升级…

stm32---dma串口发送+fifo队列框架

之前分享了一个关于gd32的fifo框架,这次就用stm32仿照写一个,其实几乎一样,这次说的更详细点,我全文都写上了注释,大家直接cv模仿我的调用方式即可 uasrt.c #include "stm32f10x.h" // D…

【生产就曲篇】让应用可观测:Actuator监控端点与日志最佳实践

摘要 本文是《Spring Boot 实战派》系列的终章,我们将探讨如何让应用真正达到**“生产就绪” (Production-Ready)** 的标准。文章的核心是可观测性 (Observability),即从外部了解一个系统内部运行状态的能力。 我们将深度挖掘 Spring Boot Actuator 的…

操作系统知识(1)

操作系统的分类总结 1、批处理操作系统:单道批处理和多道批处理(主机与外设可并行) 2、分时操作系统:一个计算机系统与多个终端设备连接。将CPU的工作时间划分为许多很短的时间片,轮流为各个终端的用户服务。 3、实时操作系统:实时是指计算机对于外来信息能够以足…

一.Sharding分库分表-基因法+自定义多key分片实现多字段查询

前言 当下遇到这样一个场景,由于订单数据量达到千万级别,采用分库分表进行优化,根据订单的热查条件:order_no订单编号进行分表,但是这样带来一个问题,用户查询自己的订单怎么查?由于分片键使用…

【leetcode】543. 二叉树的直径

二叉树的直径 题目题解解释 题目 543. 二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 题解 …

AI基础知识(07):基于 PyTorch 的手写体识别案例手册

目录 实验介绍 实验对象 实验时间 实验流程 实验介绍 随着人工智能技术的飞速发展,图像识别技术在众多领域得到了广泛应用。手写体识别作为图像 识别的一个重要分支,其在教育、金融、医疗等领域具有广泛的应用前景。本实验旨在利用深度 学习框架 PyTorc…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

信号(瞬时)频率求解与仿真实践(2)

引言 本文是信号(瞬时)频率求解与仿真实践专题的第二篇文章,在上一篇博文 [1]信号(瞬时)频率求解与仿真实践(1)-CSDN博客中,我构建了信号瞬时频率求解的基本框架,并且比较详细地讨论了瞬时频率法。这篇博文探讨适用于信号瞬时频率求解的另一种…

Linux运行发布jar文件携带哪些参数

在 CentOS 8 上运行发布的 JAR 文件时,可以根据不同需求携带以下参数: 1. 基本运行方式 bash 复制 下载 java -jar your-application.jar 2. 常用 JVM 参数 参数说明-Xms256m初始堆内存大小(如 256MB)-Xmx1024m最大堆内存大小(如 1GB)-XX:MaxMetaspaceSize=256m元空间…

在GIS 工作流中实现数据处理(4)

结果输出与可视化 最后,我们将统计结果输出为一个 Excel 文件,并在 ArcMap 中对城市中心区域的土地利用情况进行可视化展示。 import pandas as pd# 将统计表格转换为 pandas DataFrame df pd.read_csv(statistics_table, sep"\t")# 输出为…

【术语解释】网络安全((SAST, DAST, SCA, IAST),Hadoop, Spark, Hive 的关系

## OWASP Top 10等 OWASP Top 10:OWASP (Open Worldwide Application Security Project,开放全球应用程序安全项目) Top 10 是一份由全球安全专家定期更新的报告,列出了当前 Web 应用程序面临的十大最关键安全风险。 它是一个广受认可的意识文…

NY197NY205美光闪存固态NY218NY226

NY197NY205美光闪存固态NY218NY226 美光科技作为全球领先的半导体存储解决方案供应商,其闪存固态硬盘(SSD)产品线一直备受业界关注。NY197、NY205、NY218和NY226是美光近期推出的几款重要固态硬盘型号,它们在性能、容量和适用场景…