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
繁體地址,請注明出處:http://hk.pswp.cn/web/83611.shtml
英文地址,請注明出處:http://en.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是美光近期推出的幾款重要固態硬盤型號,它們在性能、容量和適用場景…