Python GeoJango:使用geoip2获得准确的设备位置

Python GeoJango:使用geoip2获得准确的设备位置,python,django,geolocation,geoip,geoip2,Python,Django,Geolocation,Geoip,Geoip2,我正在尝试获取用户的设备位置。但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

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

您能推荐一种更好的方法或正确的方法来获取用户的准确位置吗?

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

GeoIP永远都不准确,即使它是实时的。它有您的设备“接入互联网”的IP地址的位置。在你上网之前,许多提供商会先将你路由到他们的内部网络。例如,我总是在法兰克福,而我在柏林,在几百公里以北。您需要使用浏览器界面才能更准确。我希望数据集得到更新。因为我是从真实来源获得的。@Debopriyoda是的,所以他们的数据集可能有问题,可能不准确。无论如何,没有办法得到100%准确的数据。如果需要,可以修改该文件。如果您发现此答案是您问题的正确答案,请将此答案标记为正确,以便关闭此问题。