我想获取用户的位置。当我在本地计算机上测试以下代码时,它返回正确的位置。尝试使用 vpn 更改位置,并且一切正常。
应用程序.py:
@app.route('/')
def index():
url = 'http://freegeoip.net/json'
r = requests.get(url)
j = json.loads(r.text)
city = j['city']
print(city)
但是当我在 pythonanywhere 上使用相同的代码运行我的网站时,它总是返回一个错误的城市,无论我从哪里连接都无关紧要。它会返回服务器的位置吗?如何获取每个用户的正确位置?
最佳答案
您正在使用您的服务器 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
header 。但请记住使用正确的值。 Have a look at this good solution for more info 。关于python - 获取用户在 Flask 中的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50252156/