Django解决无法从request.POST中获取URL传进来的参数

 更新时间:2023年12月28日 14:28:41   作者:Similar_Fair  
这篇文章主要介绍了Django解决无法从request.POST中获取URL传进来的参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

上周做项目的时候,有个Post Webhook回调不仅在Body里传了数据,同时URL里也传了参数。

request.POST这个QueryDict打印出来的值为{},无法获取URL中的参数。

原因分析

这种问题,首先就是看代码。

大概扫了下Request的代码,问题出在如下的位置:

    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.
                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()

这个回调接口传进来的content_type 为 application/xml,所以会默认不解析。

其实按照这段代码来看,只要是Post请求,都不会解析URL上的参数(我觉得这才是正常套路,接口回调不规范,他们要背锅)。

问题解决

其实很简单,我们只需要把带参数的URL搞出来即可。

post = QueryDict(request.get_full_path().split('?')[1])
post.get('xx')

或者

# 这段代码是根据get_full_path的具体实现写出来的,还没测,提供个思路给大家
post = QueryDict(iri_to_uri(self.META.get('QUERY_STRING', '')))
post.get('xx')

get_full_path具体实现如下:

    def get_full_path(self, force_append_slash=False):
        return self._get_full_path(self.path, force_append_slash)
        
    def _get_full_path(self, path, force_append_slash):
        # RFC 3986 requires query string arguments to be in the ASCII range.
        # Rather than crash if this doesn't happen, we encode defensively.
        return '%s%s%s' % (
            escape_uri_path(path),
            '/' if force_append_slash and not path.endswith('/') else '',
            ('?' + iri_to_uri(self.META.get('QUERY_STRING', ''))) if self.META.get('QUERY_STRING', '') else ''
        )

(遇事不决,看代码就对了)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python正则表达式的使用范例详解

    Python正则表达式的使用范例详解

    本文将是一系列关于Python正则表达式文章的其中一部分。在这个系列的第一篇文章中,我们将重点讨论如何使用Python中的正则表达式并突出Python中一些独有的特性。
    2014-08-08
  • Python 检查数组元素是否存在类似PHP isset()方法

    Python 检查数组元素是否存在类似PHP isset()方法

    isset方法来检查数组元素是否存在,在Python中无对应函数,在Python中一般可以通过异常来处理数组元素不存在的情况,而无须事先检查
    2014-10-10
  • 浅谈numpy 函数里面的axis参数的含义

    浅谈numpy 函数里面的axis参数的含义

    这篇文章主要介绍了numpy 函数里面的axis参数的含义,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • PyQt5爬取12306车票信息程序的实现

    PyQt5爬取12306车票信息程序的实现

    12306是学习爬虫的比较好的一个练手网站。本文主要实现了PyQt5爬取12306车票信息程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • python中的不可变数据类型与可变数据类型详解

    python中的不可变数据类型与可变数据类型详解

    探寻python的数据类型是否可变,也可以更好的理解python对内存的使用情况,下面这篇文章主要给大家介绍了关于python中不可变数据类型与可变数据类型的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • Python isalpha()函数的具体使用方法详解

    Python isalpha()函数的具体使用方法详解

    这篇文章主要介绍了Python isalpha()函数的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 一文教会你pandas plot各种绘图

    一文教会你pandas plot各种绘图

    这篇文章主要给大家介绍了关于pandas plot各种绘图的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Python连接Azure Storage进行数据交互的实现

    Python连接Azure Storage进行数据交互的实现

    本文主要介绍了Python连接Azure Storage进行数据交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python中工厂模式的实现小结

    Python中工厂模式的实现小结

    工厂模式是一种创建型设计模式,通过定义一个工厂类,将对象的实例化过程封装起来,本文主要介绍了Python中工厂模式的实现小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • python散点图的绘制

    python散点图的绘制

    这篇文章主要介绍了python散点图的绘制,这是的绘制图有二维散点图的绘制,采用pandas.plotting.scatter_matrix函数绘制和采用seaborn进行绘制等绘制方式,需要的小伙伴可以参考一下
    2022-02-02

最新评论