我想获得用户的位置。当我在本地计算机上测试以下代码时,它返回正确的位置。尝试用vpn更改位置,一切也正常工作。
app.py:
@app.route('/')
def index():
url = 'http://freegeoip.net/json'
r = requests.get(url)
j = json.loads(r.text)
city = j['city']
print(city)
但是当我在pythonany上使用相同的代码运行我的网站时,它会一直返回一个不正确的城市,无论我从哪里连接都无关紧要。它会返回服务器的位置吗?如何获得每个用户的正确位置?
答案 0 :(得分:3)
您正在使用服务器IP进行地理定位。当您访问该特定端点时,它将获取客户端IP地址,因此当您将应用程序部署到Pythonanywhere时 - 该端点的客户端将成为服务器。
当您在PC上本地运行时,您使用您的IP地址请求API端点 - 因此,如果您切换到VPN,您的IP地址也会更改。
为了修复当前代码,您需要将客户端的IP地址传递给freegeoip.net/json
端点。试试这个:
from flask import request
@app.route('/')
def index():
url = 'http://freegeoip.net/json/{}'.format(request.remote_addr)
r = requests.get(url)
j = json.loads(r.text)
city = j['city']
print(city)
但请注意,此API端点已弃用,并将于2018年7月1日停止工作。有关详细信息,请访问:https://github.com/apilayer/freegeoip#readme - 您可能希望开始使用他们的新服务 - 我的解决方案仍然适用于他们的新API。
在某些情况下(例如在Pythonanywhere中),您的Web应用程序前可能会有一个代理服务器,导致request.remote_addr
无用。在这种情况下,您应该使用X-Forwarded-For
标头。请记住使用正确的值。 Have a look at this good solution for more info