我想通過檢測IP地址的位置將我的用戶重定向到我的網站中的特定位置區域。Django,檢索IP位置
在Django 1.1.1下實現這個最好的方法是什麼?
感謝
編輯:我想在歐洲城市基礎locationing。
我想通過檢測IP地址的位置將我的用戶重定向到我的網站中的特定位置區域。Django,檢索IP位置
在Django 1.1.1下實現這個最好的方法是什麼?
感謝
編輯:我想在歐洲城市基礎locationing。
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很詳細的解釋的事情;我會花一點時間仔細閱讀它們。
仍然是2015年Geoip追蹤的最佳選擇? – Coderaemon 2015-08-17 05:19:59
自Django 1.9以來,這已被棄用。改爲使用GeoIP2(https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geoip2/) – 2016-08-14 14:36:35
一塊蛋糕,它對許多(但不是全部)用途都是免費的。
轉到MaxMind.com並按照friendly instructions。從頭開始,我花了大約30分鐘的時間讓它在Django應用程序中運行。我對已知的IP進行了一些測試,它們很準確,甚至在免費版本中也是很。
你可以創建它獲取用戶的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是否在特定的塊中。
這是一個解決方案,從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數據庫。 「
您可以在某個地方維護一個已知IP的緩存,因此每次有人碰到您的時候都不需要戳WIPmania現場。 – 2010-08-01 20:58:53
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': '...', ...}
絕對更容易設置。 – 2010-02-08 15:38:47
看起來pygeoip正在轉向github:https://github.com/appliedsec/pygeoip – Guerry 2013-08-21 19:18:27
這對於Windows來說非常實用。強烈推薦。 – cheenbabes 2015-06-26 20:12:44
你想怎麼區分用戶?基於國家?在大陸?講的語言?等等? – 2010-02-07 20:11:55