Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django,检索IP位置_Django_Geolocation - Fatal编程技术网

Django,检索IP位置

Django,检索IP位置,django,geolocation,Django,Geolocation,我想通过从他们的IP地址检测他们的位置,将我的用户重定向到我网站中的特定位置区域 在Django 1.1.1下实现这一点的最佳方法是什么 谢谢 编辑:我想要欧洲城市定位。小菜一碟,很多(但不是所有)用途都是免费的 前往并遵循以下步骤。从开始到结束在Django应用程序中运行这个程序花了我大约30分钟。我在已知IP上做了许多测试,它们非常准确,即使是在免费版本中。看起来它会满足您的需要。我不确定您希望如何指导用户,但使用,您可以执行以下操作: from django.contrib.gis.uti

我想通过从他们的IP地址检测他们的位置,将我的用户重定向到我网站中的特定位置区域

在Django 1.1.1下实现这一点的最佳方法是什么

谢谢


编辑:我想要欧洲城市定位。

小菜一碟,很多(但不是所有)用途都是免费的

前往并遵循以下步骤。从开始到结束在Django应用程序中运行这个程序花了我大约30分钟。我在已知IP上做了许多测试,它们非常准确,即使是在免费版本中。

看起来它会满足您的需要。我不确定您希望如何指导用户,但使用,您可以执行以下操作:

from django.contrib.gis.utils import GeoIP
g = GeoIP()
ip = request.META.get('REMOTE_ADDR', None)
if ip:
    city = g.city(ip)['city']
else:
    city = 'Rome' # default city

# proceed with city

他们详细地解释了事情;我会花一点时间把它们通读一遍

您可以创建一个视图,获取用户的IP,然后发出HTTP重定向,这将导致他们的浏览器加载您想要的页面:

def redirect_based_on_ip(request):
    ip = request.meta['REMOTE_ADDR']
    if ip == SOMETHING:
        return HttpResponseRedirect('/something')
    elif ip == SOMETHING_ELSE:
        return HttpResponseRedirect('/something_else')
    # ...

如果您想测试IP是否位于特定块中,您可能会发现Python库非常有用;顺便说一句,不知道为什么下面的代码不使用;但这是可以解决的:-)

(看看其他答案,你似乎有很多选择。这个选项可能不是首选,因为它依赖于免费的第三方服务。)


注意:“如果您每个日历日的请求少于10000个,则可以出于任何目的免费使用API,无论是个人目的还是业务目的。一个简单而强大的API允许您通过单个链接查询WorldIP数据库。”

GeoIP已经提到,但我发现,如果您想将其嵌入到应用程序中,而不是安装在Python的站点包中,那么安装起来就不那么麻烦了,也不需要费心。不过,它与免费的MaxMind数据库(例如one)配合使用效果很好

使用示例(与GeoIP几乎相同):


基于一些免费服务

虽然速度不快,但您可以添加更多免费服务:

设置:

IPCOUNTRY_APYKEY = [
{# free tier 2 querys per second
    "url": "http://api.ipinfodb.com/v3/ip-country/?ip={ip}&key={key}&format=json",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "countryCode",
}, 
{# free tier 150 querys per minute and https is not suported in free tier
    "url": "http://ip-api.com/json/{ip}?fields=2",
    "params": {},
    "fieldname": "countryCode",
}, 
{# free tier 1.500 queries per day
    "url": "https://api.ipdata.co/{ip}?api-key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
}, 
{# free tier 10.000 queries per month and https is not suported in free tier
    "url": "http://api.ipstack.com/{ip}?access_key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
},
{# free tier 10.000 queries per month and https is not suported in free tier
    "url": "http://api.ipapi.com/{ip}?access_key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
},
]

代码:


您希望如何区分用户?基于国家?在欧洲大陆?说什么语言?等等?你可以在某个地方维护一个已知IP的缓存,这样就不必在每次有人访问你的站点时都戳到WIPmania。如何在
数据库中保存
用户
位置
?这对于Windows非常实用。强烈推荐。免费下载MaxMind legacy databases:,pygeoip现在已不推荐使用。2015年仍然是Geoip跟踪的最佳选项?自Django 1.9以来,该选项已不推荐使用。使用GeoIP2代替()
>>> import pygeoip
>>> gi = pygeoip.GeoIP(GEOIP_DATABASE, pygeoip.GEOIP_STANDARD)
>>> gi.record_by_addr(ip)
{'country': '...', 'country_code': '...', ...}
IPCOUNTRY_APYKEY = [
{# free tier 2 querys per second
    "url": "http://api.ipinfodb.com/v3/ip-country/?ip={ip}&key={key}&format=json",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "countryCode",
}, 
{# free tier 150 querys per minute and https is not suported in free tier
    "url": "http://ip-api.com/json/{ip}?fields=2",
    "params": {},
    "fieldname": "countryCode",
}, 
{# free tier 1.500 queries per day
    "url": "https://api.ipdata.co/{ip}?api-key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
}, 
{# free tier 10.000 queries per month and https is not suported in free tier
    "url": "http://api.ipstack.com/{ip}?access_key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
},
{# free tier 10.000 queries per month and https is not suported in free tier
    "url": "http://api.ipapi.com/{ip}?access_key={key}",
    "params": {
        "key": "*****************************",
    },
    "fieldname": "country_code",
},
import json
import urllib3

from django.conf import settings

for service in settings.IPCOUNTRY_APYKEY:
    url = service["url"].format(ip=ip,**service["params"])
    headers = {'Type': 'django', 'Ver': '1.1.1', 'Connection': 'Close'}
    urllib3.disable_warnings()
    http_call = urllib3.PoolManager()
    try:
        r = http_call.request('GET', url, headers=headers, timeout=1.0)
        if r.status == 200:
            json_response = json.loads(r.data.decode("utf-8"))
            print(json_response[service["fieldname"]])
    except Exception as e:
        pass
    
return None