2010-02-07 35 views
21

我想通過檢測IP地址的位置將我的用戶重定向到我的網站中的特定位置區域。Django,檢索IP位置

在Django 1.1.1下實現這個最好的方法是什麼?

感謝

編輯:我想在歐洲城市基礎locationing。

+0

你想怎麼區分用戶?基於國家?在大陸?講的語言?等等? – 2010-02-07 20:11:55

回答

25

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

仍然是2015年Geoip追蹤的最佳選擇? – Coderaemon 2015-08-17 05:19:59

+3

自Django 1.9以來,這已被棄用。改爲使用GeoIP2(https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geoip2/) – 2016-08-14 14:36:35

3

一塊蛋糕,它對許多(但不是全部)用途都是免費的。

轉到MaxMind.com並按照friendly instructions。從頭開始,我花了大約30分鐘的時間讓它在Django應用程序中運行。我對已知的IP進行了一些測試,它們很準確,甚至在免費版本中也是

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') 
    # ... 

您可能會發現SubnetTree庫Python的幫助,如果您想要測試IP是否在特定的塊中。

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數據庫。 「

+3

您可以在某個地方維護一個已知IP的緩存,因此每次有人碰到您的時候都不需要戳WIPmania現場。 – 2010-08-01 20:58:53

25

GeoIP已經被提及,但是我發現pygeoip安裝起來不麻煩,如果你想將它嵌入你的應用程序中而不是安裝在Python的站點包中,儘管如此,它還可以免費使用MaxMind數據庫,例如GeoLite City之一。使用(作爲GeoIP的幾乎相同)的

例子:

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

絕對更容易設置。 – 2010-02-08 15:38:47

+2

看起來pygeoip正在轉向github:https://github.com/appliedsec/pygeoip – Guerry 2013-08-21 19:18:27

+0

這對於Windows來說非常實用。強烈推薦。 – cheenbabes 2015-06-26 20:12:44