Django,检索IP位置

时间:2010-02-07 19:57:23

标签: django geolocation

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

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

由于

编辑:我想在欧洲进行基于城市的定位。

6 个答案:

答案 0 :(得分:30)

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

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

Docs详细解释事情;我会花一点时间仔细阅读它们。

答案 1 :(得分:25)

已经提到了GeoIP,但是如果你想将它嵌入你的应用程序而不是安装在Python的站点包中,我发现pygeoip安装起来不那么麻烦。不过,它适用于免费的MaxMind数据库,例如GeoLite City个。

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

>>> import pygeoip
>>> gi = pygeoip.GeoIP(GEOIP_DATABASE, pygeoip.GEOIP_STANDARD)
>>> gi.record_by_addr(ip)
{'country': '...', 'country_code': '...', ...}

答案 2 :(得分:3)

一块蛋糕,它可以免费用于许多(但不是全部)用途。

转到MaxMind.com并按照friendly instructions进行操作。从头到尾我花了大约30分钟才能在Django应用程序中运行。我对已知IP进行了大量测试,即使在免费版本中,它们也非常准确

答案 3 :(得分:2)

这是一个解决方案,来自DjangoSnippets;顺便说一句,不知道为什么下面的代码不使用urlparse;但这可以修复: - )

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

from urllib2 import urlopen, Request
import re, socket
from django.conf import settings

domain_re = re.compile('^(http|https):\/\/?([^\/]+)')
domain = domain_re.match(settings.SITE_URL).group(2)

def getUserCountry(ip):
    url = "http://api.wipmania.com/" + ip + "?" + domain
    socket.setdefaulttimeout(5)
    headers = {'Typ':'django','Ver':'1.1.1','Connection':'Close'}
    try:
        req = Request(url, None, headers)
        urlfile = urlopen(req)
        land = urlfile.read()
        urlfile.close()
        return land[:2]
    except Exception:
        return "XX"

来自WIPmania的注意事项:“如果您每个日历日的请求少于10,000个,则使用API​​可以用于任何目的,个人或企业。简单而强大的API允许您使用以下方式查询WorldIP数据库单链接。“

答案 4 :(得分:1)

您可以创建一个获取用户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的SubnetTree库很有用。

答案 5 :(得分:0)

基于一些免费服务。

这不是很快,但是您可以添加更多免费服务:

设置:

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 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",
    },
]

代码:

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