解决Django的request.POST获取不到内容的问题


Posted in Python onMay 28, 2018

我通过如下的一段程序发送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期望能获取到<QueryDict: {u'key2': [u'value2'], u'key1': [u'value1']}>,但是我发现获取到的是一个空的<QueryDict: {}>,用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,其它情况下只有一个空的<QueryDict: {}>。

从这个问题也看到了Django对'Content-Type':'application/json'没有做任何处理,跟我预想的有一点不一样。

以上这篇解决Django的request.POST获取不到内容的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
python print 按逗号或空格分隔的方法
May 02 Python
通过python顺序修改文件名字的方法
Jul 11 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 Python
Django后台获取前端post上传的文件方法
May 28 #Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 #Python
浅析Python装饰器以及装饰器模式
May 28 #Python
Python装饰器知识点补充
May 28 #Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 #Python
django manage.py扩展自定义命令方法
May 27 #Python
python实现windows下文件备份脚本
May 27 #Python
You might like
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
JS模拟多线程
2007/02/07 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
经典而简洁的婚礼主持词
2014/03/13 职场文书
合作意向书模板
2014/03/31 职场文书
单位考核鉴定意见
2015/06/05 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python