【问题标题】:Python -- Curl works, requests lib doesn'tPython——Curl 有效,请求 lib 无效
【发布时间】:2023-03-19 14:20:01
【问题描述】:

这可以从命令行运行:

 curl -H "Content-Type: application/json" -X POST -d '<my data>' http://my_user:my_pass@my_url

这在 python 脚本中不起作用:

 res=requests.post(
  'http://my_user:my_pass@my_url',  
  json='<my data>')

发生的情况是它访问服务器,但没有授权。 REST API 是用 Django Rest Framework 构建的,我得到了

{"detail":"Invalid username/password."}

http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/

密码中包含这些特殊字符 % ( \

我转义了 \ ,所以它是一个双反斜杠。我还尝试在字符串前面加上 r 和 4 个反斜杠。

我也尝试使用 auth=('my_user','my_pass') 使用不同的转义符。

我通过http://curl.trillworks.com/ 运行它,但仍然没有工作。

明天我要把我的密码改成简单的并测试一下。

如果这不起作用,我将放弃并在最后添加一个仅运行该 curl 命令的 bash 脚本。

【问题讨论】:

  • 使用 auth 参数传递凭据。
  • 当你使用auth=...时,你传递的是什么数据以及你使用的是什么usr?

标签: python curl django-rest-framework python-requests pycurl


【解决方案1】:

您需要尝试使用requests 库设置身份验证,如下所示:

from requests.auth import HTTPBasicAuth

response = requests.post(url, json=payload, auth=HTTPBasicAuth('user', 'pass'))

http://docs.python-requests.org/en/master/user/authentication/#basic-authentication

【讨论】:

  • auth=('user', 'pass') 与导入 HTTPBasicAuth 并自己做完全一样,OP 已经根据他们的问题尝试过,所以应该没有区别。
  • 是的,两者都有效。我的问题是 curl 语句中的反斜杠是为了转义括号,而不是密码本身的一部分。
【解决方案2】:

我转义了 \ ,所以它是一个双反斜杠。我也试过在前面加上 r 字符串和 4 个反斜杠。

curl 命令中的 \ 用于转义括号。它不是密码的一部分。

我删除了它,现在它可以工作了。

【讨论】: