Вызов Google Maps Geolocate API возвращает invalidRequest на веб-сервере, но не локально

У меня есть сайт Django, который работает без проблем при запуске на сервере разработки Django на моей локальной машине. Когда я пытаюсь запустить сайт в своей учетной записи pythonanywhere, все работает, за исключением одного вызова API геолокации Карт Google.

Неудачный вызов функции:

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 как на моей локальной машине, так и с консоли bash pythonanywhere. Используя эту команду:

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

Я получаю тот же ответ 400 от pythonanywhere, но получаю ожидаемые данные о местоположении на моей локальной машине. .googleapis.com входит в белый список доменов для pythonanywhere, и мой сайт Django на pythonanywhere обращается к Google Maps Геокодирование и Помещает API-интерфейсы в JavaScript и вызовы веб-приложений. услуги без проблем. Кажется, это просто проблема с Geolocate API.

Еще одна потенциально полезная информация: когда я использую флаг -v с curl для получения более подробного вывода, я вижу, что когда я делаю неверный запрос на pythonanywhere, я получаю строку:

* Server GSE is not blacklisted

чего я не вижу, когда запускаю команду локально. Я провел некоторый поиск и не могу понять, что это значит и имеет ли это значение, но оно выделялось, поэтому я решил упомянуть его на случай, если это вызовет отвращение у более знающих пользователей.

Я видел этот вопрос, и этот вопрос, а также ряд, казалось бы, связанных, нерешенных отчетов об ошибках, но Я также хотел опубликовать свой вопрос, так как мой вопрос не похож ни на один из существующих вопросов, которые я нашел. Любая помощь будет оценена по достоинству. Благодарю вас!

Обновлять:

Я провел несколько экспериментов с дроплетом DigitalOcean и обнаружил, что хотя запрос геолокации успешно возвращает информацию о местоположении при запуске на дроплете он дает мне широту и долготу адреса в Нью-Йорке (дроплет находится на сервере, который, как мне известно, находится в Нью-Йорке). К сожалению, поскольку я пытаюсь определить геолокацию пользователя, эта информация даже менее полезна, чем сообщение об ошибке...

Я до сих пор не знаю, почему запрос терпит неудачу на pythonanywhere, но успешно выполняется на DigitalOcean (за исключением того, что, возможно, как предполагает @Glenn, Goggle знает в одном случае, а не в другом, что ему даже не следует утруждать себя получением информации о местоположении), но я думаю это больше не имеет отношения к моей проблеме, потому что даже если бы это удалось на питоне в любом месте, это дало бы мне бесполезную или, что еще хуже, вводящую в заблуждение информацию. Думаю, мне придется найти другой способ получить местоположение пользователей.


person elethan    schedule 21.06.2016    source источник


Ответы (1)


Отправка пустого тела запроса в геолокацию Google означает «скажите мне, где находится эта машина». Я думаю, что Google достаточно умен, чтобы понять, что попытка получить местоположение экземпляра AWS не имеет смысла.

person Glenn    schedule 22.06.2016
comment
Это то, что я хочу сделать; то есть я хочу найти клиентскую машину. Разве он не должен указывать мне местонахождение клиента, обращающегося к экземпляру AWS (или экземпляру pythonanywhere в моем случае), а не местонахождению самого экземпляра? Есть ли способ получить местоположение человека, обращающегося к сайту, а не местоположение сервера, на котором размещен сайт (что, я согласен, бесполезно, по крайней мере, для моего случая использования)? - person elethan; 22.06.2016
comment
На этой справочной странице PythonAnywhere объясняется, как получить IP-адрес клиента, подключающегося к вашему веб-приложению. - person Giles Thomas; 24.06.2016