获取Flask中用户的位置

时间:2018-05-09 11:21:54

标签: python python-3.x flask

我想获得用户的位置。当我在本地计算机上测试以下代码时,它返回正确的位置。尝试用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上使用相同的代码运行我的网站时,它会一直返回一个不正确的城市,无论我从哪里连接都无关紧要。它会返回服务器的位置吗?如何获得每个用户的正确位置?

1 个答案:

答案 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