geoip2 - Django, Recuperar ubicación IP
geoip django (5)
Me gustaría redireccionar a mis usuarios a áreas de ubicación específicas en mi sitio web, detectando su ubicación desde su dirección IP.
¿Cuál sería la mejor manera de lograr esto en Django 1.1.1?
Gracias
Editar: Quiero ubicación basada en la ciudad en Europa.
Esta es una solución, de DjangoSnippets ; Por cierto, no estoy seguro de por qué el código a continuación no usa urlparse ; pero eso podría arreglarse :-)
(En cuanto a las otras respuestas, parece que tiene muchas opciones para elegir. Puede que esta opción no sea la preferida porque se basa en un servicio gratuito de terceros).
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"
Nota de WIPmania : "Usar API es gratis para cualquier propósito, personal o comercial, si realiza menos de 10.000 solicitudes por día calendario. Una API simple pero potente que le permite consultar la base de datos WorldIP con un solo enlace."
Pedazo de pastel, y es gratis para muchos (pero no todos) usos.
Ve a MaxMind.com y sigue las instrucciones amistosas . Comenzar a terminar me llevó unos 30 minutos ejecutarlo en una aplicación de Django. Hice una serie de pruebas de direcciones IP conocidas y son muy precisas, incluso en la versión gratuita.
Podría crear una vista que obtenga la IP del usuario y luego emita un redireccionamiento HTTP que hará que su navegador cargue la página que desea:
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'')
# ...
Puede encontrar útil la biblioteca SubnetTree para Python si desea probar para ver si una IP se encuentra en un bloque en particular.
Ya se mencionó GeoIP, pero creo que pygeoip es menos problemático de instalar y no pesimista si desea incrustarlo en su aplicación en lugar de instalarlo en los paquetes de sitio de Python. Aún así, funciona muy bien con bases de datos MaxMind gratuitas, por ejemplo, GeoLite City one.
Ejemplo de uso (casi lo mismo que para GeoIP):
>>> import pygeoip
>>> gi = pygeoip.GeoIP(GEOIP_DATABASE, pygeoip.GEOIP_STANDARD)
>>> gi.record_by_addr(ip)
{''country'': ''...'', ''country_code'': ''...'', ...}
GeoDjango parece que se adaptará a tus necesidades. No estoy seguro de cómo querría dirigir a los usuarios, pero con la API de GeoIP , puede hacer algo como:
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
Los documentos explican las cosas con gran detalle; Me tomaría un momento para leerlos a fondo.