您现在的位置是:门户> 编程语言> Python

解决Django的request.POST获取不到内容的问题
2022-01-27 73人围观 0条评论
简介今天小编就为大家分享一篇解决Django的request.POST获取不到内容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    我通过如下的一段程序发送post请求:

    import urllib3
    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期望能获取到,但是我发现获取到的是一个空的,用reqyest.body是能获取到原始的请求内容key2=value2&key1=value1的。

    这个时候只能去文档中找答案了,但是貌似Django中的文档也没给出我答案,这时候我就只能通过源码来找答案了,下面是class HttpRequest(object)中获取POST QueryDict的函数部分:

    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.
        # Mark that an error occurred. This allows self.__repr__ to
        # be explicit about it instead of simply representing an
        # empty POST
        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()
    

    函数看起来有点长,但是我们只要关注后面的if elif else这三个分支即可,从elif self.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获取不到内容的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

分享:

文章评论

    • wxpython 学习笔记 第一天
    • python文本数据处理学习笔记详解