【问题标题】:GeoDjango: Getting accurate device location with geoip2GeoDjango:使用 geoip2 获取准确的设备位置
【发布时间】:2021-02-20 10:06:10
【问题描述】:

我正在尝试获取用户设备位置。但是 geoip2 返回一个远离用户位置的位置(大约 20 公里到 25 公里)。当我通过移动网络连接我的设备时,当我将我的设备与 wifi 连接时,它会显示不同的位置

首先我得到用户的ip

def get_ip(request):
    xff = request.META.get('HTTP_X_FORWARDED_FOR')
    
    if xff:
        ip = xff.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR', None)
    return ip

但这会获取用户的私有 ip,而私有 ip 不在国家或城市数据集中,因此 geoip2 会引发错误。

所以我尝试通过网站获取公共IP地址

def get_ip(request):
    
    from requests import get
    ip = get('https://api.ipify.org').text
    
    if ip:
        return ip

现在我使用 geoip2 来获取用户位置数据

def home(request,):
....
....
....
....
    from django.contrib.gis.geoip2 import GeoIP2
    g = GeoIP2()
    ip = get_ip(request)
    print(ip)

    country = g.country(ip)
    city = g.city(ip)
    print(country, city)
    lat, long = g.lat_lon(ip)
    print(lat, long)
...
...
...
    

您能否建议一种更好的方法或正确的方法来获取用户的准确位置?

【问题讨论】:

  • GeoIP 永远不会准确,即使它是实时的。它具有您的设备“连接到互联网”的 IP 地址的位置。许多提供商在您访问网络之前首先将您路由到他们的内部网络。例如,我总是在法兰克福演出,而我在柏林以北数百公里。您需要使用Geolocation 浏览器界面才能更准确。

标签: python django geolocation geoip geoip2


【解决方案1】:

首先,您需要了解 geoip2 使用 .dat/csv 文件,这些文件只不过是包含根据国家/城市/纬度-经度的 IP 地址范围的文件。这些文件需要及时更新,以获得更准确的数据。 其次,如果您使用 localhost 执行此操作,则第一个代码将返回此 127.0.0.1 IP 地址,因为您正在获取远程 IP。

def home(request):
    xff = request.META.get('HTTP_X_FORWARDED_FOR')
    if xff:
        ip = xff.split(',')[0]
        country = g.country(ip)
        city = g.city(ip)
        lat, long = g.lat_lon(ip)
    else:
        ip = request.META.get('REMOTE_ADDR', None)
        country = 'Your Country Name'
        city='Your City'
        lat,long = 'Your Latitude','Your Longitiude'
    print(country, city)
    print(lat, long)

此代码也适用于本地主机,因此您不会收到 IP 错误。为了获得准确的位置,请更新您的 dat/csv 文件

【讨论】:

  • 我希望数据集得到更新。因为我是从真实来源获得的。
  • @DebopriyoDas 是的,因此他们的数据集可能存在问题,可能不准确。无论如何,没有办法获得 100% 准确的数据。如果你愿意,你可以修改那个文件。如果您发现此答案是您问题的正确答案,请将此答案标记为正确,以便关闭此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多