You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python Requests发POST请求报HTTP 400错误,Postman和Curl却正常?

问题分析与解决方案

核心问题:Python Requests发送POST请求到WordPress的JWT认证接口返回400错误,但Curl、Postman及向httpbin发送请求均正常,且代码之前可正常运行,推测是WordPress自动更新后接口的请求验证规则发生变化。

可能的原因及对应解决方法

1. Python Requests默认User-Agent被WordPress安全机制拦截

WordPress的安全插件(如Wordfence)或JWT插件更新后,可能会拦截带有python-requests/*标识的User-Agent。Postman和Curl使用浏览器或curl默认UA,因此能正常通过验证。

解决代码:

import requests

url = 'https://www.mywebsite.co.uk/wp-json/jwt-auth/v1/token'
payload = {
    "username": "johnnyjohnboy",
    "password": "1234 abcd 5678 edfg 9012 hijk"
}
# 模拟浏览器的User-Agent
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

resp = requests.post(url, data=payload, headers=headers)
print(resp.status_code)
print(resp.text)

2. 接口要求使用multipart/form-data格式(与Curl请求一致)

当前Python代码使用application/x-www-form-urlencoded格式,但Curl请求采用multipart/form-data,可能WordPress更新后接口仅支持后者。

解决代码:

import requests

url = 'https://www.mywebsite.co.uk/wp-json/jwt-auth/v1/token'

# 用files参数构造multipart/form-data格式请求(无需实际上传文件)
resp = requests.post(url, files={
    'username': (None, 'johnnyjohnboy'),
    'password': (None, '1234 abcd 5678 edfg 9012 hijk')
})

print(resp.status_code)
print(resp.text)

3. 检查WordPress插件配置

  • 确认JWT Auth插件是否正常启用,更新后是否需要重新配置密钥(在wp-config.php中检查JWT_AUTH_SECRET_KEY等参数)。
  • 查看安全插件的拦截日志,确认是否有针对请求IP或UA的拦截规则,添加对应白名单。

内容的提问来源于stack exchange,提问作者Johnny John Boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:37:18