Django解決無(wú)法從request.POST中獲取URL傳進(jìn)來(lái)的參數(shù)
背景
上周做項(xiàng)目的時(shí)候,有個(gè)Post Webhook回調(diào)不僅在Body里傳了數(shù)據(jù),同時(shí)URL里也傳了參數(shù)。
request.POST這個(gè)QueryDict打印出來(lái)的值為{},無(wú)法獲取URL中的參數(shù)。
原因分析
這種問(wèn)題,首先就是看代碼。
大概掃了下Request的代碼,問(wèn)題出在如下的位置:
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()
return
if self._read_started and not hasattr(self, '_body'):
self._mark_post_parse_error()
return
if self.content_type == 'multipart/form-data':
if hasattr(self, '_body'):
# Use already read data
data = BytesIO(self._body)
else:
data = self
try:
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.
self._mark_post_parse_error()
raise
elif 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()
這個(gè)回調(diào)接口傳進(jìn)來(lái)的content_type 為 application/xml,所以會(huì)默認(rèn)不解析。
其實(shí)按照這段代碼來(lái)看,只要是Post請(qǐng)求,都不會(huì)解析URL上的參數(shù)(我覺(jué)得這才是正常套路,接口回調(diào)不規(guī)范,他們要背鍋)。
問(wèn)題解決
其實(shí)很簡(jiǎn)單,我們只需要把帶參數(shù)的URL搞出來(lái)即可。
post = QueryDict(request.get_full_path().split('?')[1])
post.get('xx')或者
# 這段代碼是根據(jù)get_full_path的具體實(shí)現(xiàn)寫(xiě)出來(lái)的,還沒(méi)測(cè),提供個(gè)思路給大家
post = QueryDict(iri_to_uri(self.META.get('QUERY_STRING', '')))
post.get('xx')get_full_path具體實(shí)現(xiàn)如下:
def get_full_path(self, force_append_slash=False):
return self._get_full_path(self.path, force_append_slash)
def _get_full_path(self, path, force_append_slash):
# RFC 3986 requires query string arguments to be in the ASCII range.
# Rather than crash if this doesn't happen, we encode defensively.
return '%s%s%s' % (
escape_uri_path(path),
'/' if force_append_slash and not path.endswith('/') else '',
('?' + iri_to_uri(self.META.get('QUERY_STRING', ''))) if self.META.get('QUERY_STRING', '') else ''
)(遇事不決,看代碼就對(duì)了)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python讀取圖像并顯示灰度圖的實(shí)現(xiàn)
這篇文章主要介紹了Python讀取圖像并顯示灰度圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python list等分并從等分的子集中隨機(jī)選取一個(gè)數(shù)
這篇文章主要介紹了python list等分并從等分的子集中隨機(jī)選取一個(gè)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python隨機(jī)驗(yàn)證碼生成和join?字符串的問(wèn)題解析
Python中有join()和os.path.join()兩個(gè)函數(shù),join是將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個(gè)新的字符串而os.path.join():?將多個(gè)路徑組合后返回,本文給大家介紹的非常詳細(xì),需要的朋友一起看看吧2022-04-04
使用Python實(shí)現(xiàn)調(diào)整Excel中的行列順序
調(diào)整Excel?行列順序指的是改變工作表中行或列的位置,以便更好地展示和分析數(shù)據(jù),本文將介紹如何通過(guò)Python高效地調(diào)整Excel?行列順序,感興趣的可以了解下2025-01-01
基于Python+OpenCV實(shí)現(xiàn)自動(dòng)掃雷功能
相信許多人很早就知道有掃雷這么一款經(jīng)典的游(顯卡測(cè)試)戲(軟件),掃雷作為一款在Windows9x時(shí)代就已經(jīng)誕生的經(jīng)典游戲,從過(guò)去到現(xiàn)在依然都有著它獨(dú)特的魅力,所以本文小編給大家介紹了如何使用Python+OpenCV實(shí)現(xiàn)自動(dòng)掃雷效果,感興趣的朋友可以參考下2023-12-12
matlab中實(shí)現(xiàn)矩陣刪除一行或一列的方法
下面小編就為大家分享一篇matlab中實(shí)現(xiàn)矩陣刪除一行或一列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python如何高效找出序列中出現(xiàn)次數(shù)最多的元素
這篇文章主要為大家詳細(xì)介紹了Python如何高效找出序列中出現(xiàn)次數(shù)最多的元素,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-08-08
Python 16進(jìn)制與中文相互轉(zhuǎn)換的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Python 16進(jìn)制與中文相互轉(zhuǎn)換的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python入門(mén)教程(三)Python語(yǔ)法解析
這篇文章主要介紹了Python入門(mén)教程(三)Python語(yǔ)法解析,Python是一門(mén)非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門(mén)教程,需要的朋友可以參考下2023-04-04
Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

