解决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 相关文章推荐
python多线程扫描端口示例
Jan 16 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
opencv与numpy的图像基本操作
Mar 08 Python
Python3.5装饰器典型案例分析
Apr 30 Python
python3.7 的新特性详解
Jul 25 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
django ORM之values和annotate使用详解
May 19 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
pytest进阶教程之fixture函数详解
Mar 29 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
10条PHP高级技巧[修正版]
2011/08/02 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python组合无重复三位数的实例
2018/11/13 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
应届大专毕业生自我鉴定
2014/04/08 职场文书
指导教师评语
2014/04/26 职场文书
李强为自己工作观后感
2015/06/11 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL