使用 Python 请求模块时出现 Heroku 403 禁止错误

时间:2021-05-23 08:12:20

标签: django heroku python-requests http-status-code-403 dyno

我正在开发一个 Django 应用程序,目前部署在一个使用 CoWin public API 的 Free Heroku dyno 上。

在 Heroku 服务器上,requests.get() 方法返回 HttpResponse 状态代码 403
这就是我的 API 调用的样子 -

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
url = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByPin?pincode=110001&date=23-05-2021"
api_response = requests.get(url, headers = headers)

当我使用 heroku local 命令在本地运行它时,一切正常,返回的 HttpResponse 状态代码为 200。我无法理解为什么在 Heroku 服务器上运行它时返回 403 状态代码。

2 个答案:

答案 0 :(得分:1)

这与我最初开始构建疫苗跟踪器应用程序时遇到的问题完全相同。

问题背后的原因是这些 COWIN API 是地理围栏的,由于地理围栏,印度地区以外的任何服务器都无法运行。在 heroku 上部署您的应用程序后,您可能会收到“内部服务器错误”,并且在本地运行时必须正常工作。

出于安全原因,浏览器会限制从脚本发起的跨源 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一来源请求资源,除非来自其他来源的响应包含正确的 CORS 标头。

跨源资源共享标准的工作原理是添加新的 HTTP 标头,让服务器描述允许哪些源从 Web 浏览器读取该信息。 Reference

您可以使用 JavaScript 的 Fetch API 来发出 HTTP 请求,浏览器带有一个全局 fetch() 函数,我们可以使用它来发出请求。 fetch() 的参数是服务器端资源的 URL。然后我们将 promise 与 then() 方法链接起来,该方法在 response 参数中捕获 HTTP 响应并调用其 json() 方法。 Reference

fetch() 函数向我们的 API 发送 GET 请求

fetch(url)
    .then(response => response.json())
    .then(json => console.log(json));

现代浏览器在 XMLHttpRequest 或 Fetch 等 API 中使用 CORS 来降低跨域 HTTP 请求的风险。

因此这对我有用,从客户端浏览器发出请求,而不是从服务器发出 api 调用来获取数据。否则,您可以尝试探索 HTTP 代理集成。

答案 1 :(得分:0)

检查大小写敏感的东西,如导入,如果可能,需要更多信息