У меня есть сайт 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 знает в одном случае, а не в другом, что ему даже не следует утруждать себя получением информации о местоположении), но я думаю это больше не имеет отношения к моей проблеме, потому что даже если бы это удалось на питоне в любом месте, это дало бы мне бесполезную или, что еще хуже, вводящую в заблуждение информацию. Думаю, мне придется найти другой способ получить местоположение пользователей.