【问题标题】:Google Maps Geolocate API call returns invalidRequest on web server but not locallyGoogle Maps Geolocation API 调用在 Web 服务器上返回无效请求,但不在本地
【发布时间】:2016-10-23 08:26:02
【问题描述】:

我有一个 Django 站点,在我的本地机器上的 Django 开发服务器上运行时可以正常工作。当我尝试在我的pythonanywhere 帐户上运行该站点时,除了对Google Maps Geolocation API 的一次调用之外,一切正常。

失败的函数调用是:

def geolocate():
    url = "https://www.googleapis.com/geolocation/v1/geolocate?key=%s" % API_KEY
    r = requests.post(url)
    lat_lng = r.json()['location']
    return (lat_lng['lat'], lat_lng['lng'])

在 pythonanywhere 上运行时,我从 requests.post() 调用得到的响应是:

{
"error": {
  "errors": [
   {
    "domain": "geolocation",
    "reason": "invalidRequest",
    "message": "Bad Request"
   }
  ],
  "code": 400,
  "message": "Bad Request"
 }
}

而当我在开发服务器上运行它时,我得到:

{
 "location": {
  "lat": 39.9546734,
  "lng": -96.5985613
 },
 "accuracy": 2678.0
}

这是我正在寻找的响应。

我还尝试在本地机器和 pythonanywhere bash 控制台上使用 curl 发出请求。使用这个命令:

curl 'https://www.googleapis.com/geolocation/v1/geolocate?key=MY_API_KEY' -H "Content-Type: application/json" -d {}

我从 pythonanywhere 得到相同的400 响应,但在我的本地计算机上获得了预期的位置数据。 .googleapis.com 是 pythonanywhere 的白名单域之一,我在 pythonanywhere 上的 Django 站点在 JavaScript 中调用 Google Maps GeocodePlaces API 以及调用 Web 服务时没有任何问题。这似乎只是 Geolocate API 的问题。

另一个可能有用的信息:当我使用 -v 标志和 curl 来获得更详细的输出时,我看到当我在 pythonanywhere 上发出“错误请求”时,我得到了这条线:

* Server GSE is not blacklisted

我在本地运行命令时看不到。我进行了一些搜索,无法弄清楚这意味着什么或是否相关,但它很突出,所以我想我会提一下,以防它为更多知识渊博的用户引起注意。

我看到了this questionthis question,以及一些看似相关但未解决的错误报告,但我也想发布我的问题,因为我的问题似乎与任何现有问题都不相同我已经发现。任何帮助,将不胜感激。谢谢!

更新:

我在DigitalOcean droplet 上做了一些实验,发现虽然地理定位请求在 droplet 上运行时成功返回位置信息,但它为我提供了纽约市地址的纬度和经度(droplet 开启我知道位于纽约市的服务器)。不幸的是,由于我正在尝试对用户进行地理定位,因此这些信息甚至不如错误消息有用...

我仍然不知道为什么请求在 pythonanywhere 上失败但在 DigitalOcean 上成功(除了可能,正如@Glenn 建议的那样,Goggle 在一种情况下而不是另一种情况下知道它甚至不应该费心检索位置信息),但我想这与我的问题不再相关,因为即使它确实在 pythonanywhere 上成功,它也会给我无用的 - 或者更糟的是,误导 - 信息。我想我将不得不想出另一种方法来获取用户的位置。

【问题讨论】:

    标签: django google-maps http pythonanywhere google-geolocation


    【解决方案1】:

    向谷歌地理定位发送一个空的请求正文相当于“告诉我这台机器在哪里”。我认为谷歌足够聪明,知道试图获取 AWS 实例的位置是没有意义的。

    【讨论】:

    • 这就是我想做的;也就是说,我想定位客户端机器。它不应该告诉我访问 AWS 实例(或在我的情况下为 pythonanywhere 实例)的客户端的位置,而不是实例本身的位置吗?有什么方法可以获取访问该站点的人的位置,而不是托管该站点的服务器的位置(我同意这没有用,至少对于我的用例而言)?
    • This PythonAnywhere help page 解释了如何获取连接到您的网络应用程序的客户端的 IP 地址。
    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 2016-09-03
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2013-01-14
    • 2019-07-26
    相关资源
    最近更新 更多