使用邮递员的 GET 请求有效,但不适用于 python (HTTPSConnectionPool)
Posted
技术标签:
【中文标题】使用邮递员的 GET 请求有效,但不适用于 python (HTTPSConnectionPool)【英文标题】:GET request with postman is working, but it does not work with python (HTTPSConnectionPool) 【发布时间】:2019-08-28 21:29:58 【问题描述】:我正在尝试从 API 获取 JSON,然后可以在使用 django 构建的网站上显示该 API,并且 API 是使用 rest_framework 制作的。我已经尝试过 Requests 和 http.client 但我得到了同样的错误:
HTTPSConnectionPool(host='webpageUrl' port=443):最大重试次数超出了 url:/api/donations(由 ConnectTimeoutError 引起(
我尝试在 Postman 中使用 GET 请求进行调试,效果很好,但是当我使用 Requests 库文档中提供的示例或使用 Postman 中生成的代码 sn-p 时,我得到了上述错误。此外,我之前有基本身份验证,我认为这是问题的根源,因此我关闭了身份验证但它不起作用。
这是我目前正在尝试的代码:
import requests
def available_donations(request):
assert isinstance(request,HttpRequest)
response = requests.get("webpageUrl/api/donations", headers='Content-Type':'application/json', timeout=5)
return render(
request,
'app/availableDonations.html', 'donation':response,
'title':'Overview of available donations'
)
我预计会收到有关网页呈现的错误,但是从我可以从不同的 *** 问题中读取到的错误意味着它找不到网页。
提前致谢!
编辑1:
我尝试在我的个人计算机上运行来自邮递员的 sn-p 代码,它可以工作。我认为问题在于它无法使用我使用的方法向 API(位于同一台服务器上)发出 HTTP 请求。此外,我尝试使用这种有效的方法运行不同的虚拟 API。
【问题讨论】:
postman 中有 SSL 验证设置。如果你把它关掉,这个请求在邮递员中仍然有效吗? 我尝试在 Postman 中关闭 SSL 证书验证,但它仍然有效。 几个问题:python 代码是否在您运行 Postman 的同一台机器上运行?它是在本地运行还是在容器或虚拟机中运行?这听起来更像是网络问题,而不是 Python / 请求问题。 python代码运行在不同机器上的Linux服务器上,邮递员在我的个人电脑上 【参考方案1】:我发现我使用的方法对内部 HTTPS 请求无效。我使用 ifconfig 查看本地 IP 地址,并使用它代替主机并将 IP 地址放在 settings.py 中的 ALLOWED_HOSTS 中。此外,我使用 verify=False 禁用了 SSL 验证
def getDonations():
url = "https://172.19.10.5/api/donations"
payload = ""
headers =
'cache-control': "no-cache",
response = requests.request("GET", url, data=payload, headers=headers, timeout=5, verify=False)
print(response.text)
return response.text
【讨论】:
【参考方案2】:尝试验证会话
session = requests.Session()
session.verify = True
session.get("webpageUrl/api/donations", headers='Content-Type':'application/json', timeout=5, verify=True)
【讨论】:
以上是关于使用邮递员的 GET 请求有效,但不适用于 python (HTTPSConnectionPool)的主要内容,如果未能解决你的问题,请参考以下文章
POST 请求适用于 Postman,但不适用于 Guzzle
Ajax POST 不适用于 spring security csrf,但 GET 方法有效