1

我有一个 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'])

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

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

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

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

这是我正在寻找的回应。

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

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

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

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

* Server GSE is not blacklisted

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

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

更新:

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

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

4

1 回答 1

3

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

于 2016-06-22T11:06:00.423 回答