【问题标题】:Python Requests - Why doesn't POST fall back to GET in case of no POST data?Python 请求 - 为什么在没有 POST 数据的情况下 POST 不回退到 GET?
【发布时间】:2026-02-01 12:10:01
【问题描述】:

运行python 3.5.1 版和requests 模块2.9.1 版

有效的旧版本 - python 版本 2.7.9,遗憾的是没有 requests 模块版本。


在以前的情况下,我只需要处理 POSTGET 请求。

以前,使用requests 模块,当指定POST 请求并将data 关键字参数设置为None 时,请求将默认返回GET 请求。

request = requests.post(url=self.url, headers=self.headers,
                        data=self.data, timeout=self.timeout, 
                        proxies=self.proxies, verify=False)

这非常棒,因为您可以编写一个通用的 request 函数,在一个块中涵盖 GETPOST 请求。然而,这似乎不再是这种情况了,这导致我编写了一些丑陋的代码,如下所示:

if self.data:
    request = requests.post(url=self.url, headers=self.headers,
                            data=self.data, timeout=self.timeout, 
                            proxies=self.proxies, verify=False)
else:
    request = requests.get(url=self.url, headers=self.headers,
                           data=None, timeout=self.timeout, 
                           proxies=self.proxies, verify=False)

这并不是真正可取的。我已经浏览了requests Github 和文档,看看是否有任何文件记录了这一点,但似乎并非如此。

此功能是否已被删除,还是在新版本中有所更改?

【问题讨论】:

  • 哇,所谓的旧行为是恶心。您可以有空正文的 POST 请求。神奇地使用不同的请求类型,当用户明确请求.post 时,似乎很疯狂。
  • @JeremyBanks - 您可以指定空主体,只有当它设置为 None 时才会回退到 GET 请求。 .post 确实有点违反直觉,但我更喜欢添加一个解释清楚的单个注释,而不是必须在两个不同的地方复制同一个块(成为维护问题)。可能是个人喜好:-)
  • 事实证明,我之前的做法还有更好的替代方案!

标签: python python-requests


【解决方案1】:

您也可以只使用request() 函数而不是getpost 便利函数。

import requests

response = requests.request('POST' if self.data else 'GET', url=self.url, 
                             headers=self.headers, data=self.data or None, 
                             timeout=self.timeout, proxies=self.proxies, verify=False)

【讨论】:

  • 我觉得这是更好的选择,因为它保存在 requests 模块中。谢谢。
【解决方案2】:

你可以让代码更漂亮:

if self.data:
    fn = requests.post
else:
    fn = requests.get

request = fn(url=self.url, headers=self.headers, data=self.data or None,
             timeout=self.timeout, proxies=self.proxies, verify=False)

(我意识到这不是答案,但我不知道如何在评论中发布格式化代码。)

【讨论】:

  • 我喜欢这个!谢谢约翰:-)。不幸的是,正如您所提到的,这并不能直接回答问题,因此将其标记为答案不太公平。
  • 一个答案。即使是对问题的回答,而不是对问题的回答 - 但一旦问题本身要求底层库的不良行为,这是双重有用的。