解决Django的request.POST获取不到内容的问题
我通过如下的一段程序发送post请求:
importurllib3 pool=urllib3.connection_from_url('http://127.0.0.1:8090') resp=pool.request('POST','/polls/',fields={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/json'},encode_multipart=False)
在服务器端我用request.POST期望能获取到
这个时候只能去文档中找答案了,但是貌似Django中的文档也没给出我答案,这时候我就只能通过源码来找答案了,下面是classHttpRequest(object)中获取POSTQueryDict的函数部分:
def_load_post_and_files(self): """Populateself._postandself._filesifthecontent-typeisaformtype""" ifself.method!='POST': self._post,self._files=QueryDict(encoding=self._encoding),MultiValueDict() return ifself._read_startedandnothasattr(self,'_body'): self._mark_post_parse_error() return ifself.content_type=='multipart/form-data': ifhasattr(self,'_body'): #Usealreadyreaddata data=BytesIO(self._body) else: data=self try: self._post,self._files=self.parse_file_upload(self.META,data) exceptMultiPartParserError: #AnerroroccurredwhileparsingPOSTdata.Sincewhen #formattingtheerrortherequesthandlermightaccess #self.POST,setself._postandself._filetoprevent #attemptstoparsePOSTdataagain. #Markthatanerroroccurred.Thisallowsself.__repr__to #beexplicitaboutitinsteadofsimplyrepresentingan #emptyPOST self._mark_post_parse_error() raise elifself.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()
函数看起来有点长,但是我们只要关注后面的ifelifelse这三个分支即可,从elifself.content_type=='application/x-www-form-urlencoded':这个分支能看到只有请求header中的'Content-Type':'application/x-www-form-urlencoded'才会填充request.POST,其它情况下只有一个空的
从这个问题也看到了Django对'Content-Type':'application/json'没有做任何处理,跟我预想的有一点不一样。
以上这篇解决Django的request.POST获取不到内容的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。