【问题标题】:Get location of user in Flask获取用户在 Flask 中的位置
【发布时间】:2018-05-09 11:21:53
【问题描述】:

我想获取用户的位置。当我在本地计算机上测试以下代码时,它会返回正确的位置。尝试使用 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)

但是当我在 pythonanywhere 上使用相同的代码运行我的网站时,它总是返回一个错误的城市,无论我从哪里连接都没有关系。它是否返回服务器的位置?如何获取每个用户的正确位置?

【问题讨论】:

    标签: python python-3.x flask


    【解决方案1】:

    您正在使用您的服务器 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.

    【讨论】:

    • 我尝试这样做,但问题是 request.remote_addr 返回私有 ip 地址,并且对此类 ip 的请求输出为空
    • 尝试将其部署到服务器上,看看是否可行。如果不是,请尝试使用request.headers.get('X-Forwarded-For'),而不是使用request.remote_addr - 通常http 服务器应该为您设置远程地址,但在某些情况下,它只会将原始IP 地址放在该标头中。我没有在任何地方使用 Python,所以我不确定它使用的是哪一个。
    • 谢谢,request.headers.get('X-Forwarded-For') 成功了!
    • 太好了,我将编辑答案以包含它。
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多