0

我正在尝试获取用户设备位置。但是 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)
...
...
...
    

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

4

1 回答 1

0

首先,您需要了解 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 文件

于 2020-11-08T07:15:52.673 回答