解决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编程中的命名空间与作用域
Oct 16 Python
Python中set与frozenset方法和区别详解
May 23 Python
详解Python中for循环是如何工作的
Jun 30 Python
python中使用print输出中文的方法
Jul 16 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
python仿evething的文件搜索器实例代码
May 13 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
python支持多继承吗
Jun 19 Python
python os模块在系统管理中的应用
Jun 22 Python
如何用python开发Zeroc Ice应用
Jan 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
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python实现报表自动化详解
2017/11/16 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
flask应用部署到服务器的方法
2019/07/12 Python
Django实现跨域请求过程详解
2019/07/25 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python模块常用用法实例详解
2019/10/17 Python
Python是如何进行类型转换的
2013/06/09 面试题
物理系毕业生自荐信
2013/11/01 职场文书
企业后勤岗位职责
2014/02/28 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
python tkinter实现定时关机
2021/04/21 Python
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python