ローカル マシンの Django dev サーバーで実行すると、問題なく動作する Django サイトがあります。pythonanywhereアカウントでサイトを実行しようとすると、 Google Maps Geolocation APIへの 1 回の呼び出しを除いてすべてが機能します。
失敗している関数呼び出しは次のとおりです。
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 のホワイトリストに登録されたドメインの 1 つです。pythonanywhere の私の Django サイトは、JavaScript で Google Maps GeocodeとPlaces APIを呼び出し、Web サービスを問題なく呼び出します。Geolocate API の問題のようです。
もう1つの潜在的に役立つ情報:-v
フラグを使用curl
してより詳細な出力を取得すると、pythonanywhereで「Bad Request」を作成すると、次の行が表示されることがわかります。
* Server GSE is not blacklisted
コマンドをローカルで実行しても表示されません。私はいくつかの検索を行ったが、それが何を意味するのか、または関連性があるのか を理解することはできませんが、目立っていたので、より知識のあるユーザーにフラグを立てた場合に言及すると思いました.
この質問、およびこの質問、および一見関連する未解決のバグレポートを多数見ましたが、私の質問は私が見つけた既存の質問と同一ではないように思われるため、質問も投稿したいと思いました。どんな助けでも大歓迎です。ありがとうございました!
アップデート:
DigitalOceanドロップレットで実験を行ったところ、ジオロケーション リクエストをドロップレットで実行すると位置情報が正常に返される一方で、ニューヨーク市の住所の緯度と経度が返されることがわかりました (ドロップレットは私が知っているサーバー上にあります)ニューヨーク市に所在する)。残念ながら、私はユーザーの位置を特定しようとしているので、この情報はエラー メッセージよりも役に立ちません...
要求が pythonanywhere で失敗するのに DigitalOcean で成功する理由はまだわかりません (ただし、@Glenn が示唆するように、ゴーグルはある場合には位置情報を取得する必要さえないことを知っていて、別のケースでは知っていません)、しかし私は推測しますpythonanywhereで成功したとしても、役に立たない、またはさらに悪いことに誤解を招くような情報が得られるため、これは私の問題には関係ありません。ユーザーの場所を取得する別の方法を考え出す必要があると思います。