首页 > 解决方案 > 部署到 heroku 后位置更改为 Ashburn

问题描述

我正在使用 openweathermap 获取天气数据并检测用户的位置并显示数据......当我在 localhost 中使用它时,我得到了正确的位置,但是当我将它部署到 heroku 时,它显示的位置为 Ashburn.. .如何解决这个问题?

我正在使用它来获取用户的位置: https ://ip-geolocation.whoisxmlapi.com/api/v1?apiKey=myApiKey

url1='https://ip-geolocation.whoisxmlapi.com/api/v1?apiKey=MyApiKey'
res = requests.request('GET', url1)
Jdata = res.json()
city = Jdata['location']['city']
completed_url = "http://api.openweathermap.org/data/2.5/weather? 
appid=myapiid&q="+city

r = requests.get(completed_url)
abcd = r.json()
abcdmain = abcd['main']

https://apiappanirudh.herokuapp.com/

访问应用程序的上述链接..

我希望应用程序检测用户的位置,然后显示...位置更改背后的原因是什么以及如何解决?

注意:我正在使用烧瓶。

谢谢。

标签: pythonflaskherokuip-geolocation

解决方案


使用 IP 地理定位 API 时,您应该区分两种情况:是从客户端调用地理定位 API还是从服务器端调用地理定位 API 。

在前一种情况下,这意味着您正在从客户端浏览器查询 IP 地理定位 API,例如使用 JavaScript。在这种情况下,大多数地理定位 API 都提供了一个原始端点,您无需指定任何 IP 地址即可调用该端点。您将获得与运行浏览器的客户端关联的 IP 地址的信息。这是使用Ipregistry的示例:

https://api.ipregistry.co/?key=tryout&pretty=true

在后一种情况下,您将收到对您的服务器的请求,并且您正在从您的服务器调用 IP 地理定位 API。它可以使用 PHP、NodeJS、Java,以及应用服务器或代理背后的任何编程语言。如果我们画一个流程图,它看起来如下:

A client --> Your server --> IP geolocation API

如果您在没有指定更多信息的情况下调用 IP 地理定位 API,那么地理定位 API 所能做的最好的事情就是发现服务器后面的 IP 地址是什么(即请求的来源)。这就是你描述的问题和你所经历的。

希望大多数 IP 地理定位 API 都包含一个端点,您可以在其中指定要查找数据的 IP 地址。因此,当您在服务器上收到来自客户端的请求时,您需要从请求中提取客户端 IP 地址,然后使用允许传递 IP 地址的专用 IP 地理定位 API 端点。

如何从您在服务器上收到的请求中提取客户端 IP 地址?这是特定于您的应用程序的。这就是为什么没有一种适合所有解决方案的原因。大多数情况下,请求标头中包含您要查找的值。例如,标头X-Forwarded-For很常见但不是标准的。在 PHP 中,您需要使用$_SERVER['REMOTE_ADDR'].

假设您将客户端 IP 地址标识为200.77.121.230,然后使用 Ipregistry,您将通过对下一个端点的 HTTP GET 请求获取位置和威胁数据:

https://api.ipregistry.co/200.77.121.230?key=tryout&pretty=true


推荐阅读