2010-02-07 28 views
21

me gustaría redirigir mis usuarios a áreas específicas de la ubicación en mi página web, mediante la detección de la ubicación de su dirección IP.Django, Recuperar localización de IP

¿Cuál sería la mejor manera de lograr esto en Django 1.1.1?

Gracias

Editar: quiero locationing ciudad basada en europa.

+0

¿Cómo se quiere distinguir a los usuarios? Basado en el país? En el continente? ¿Lenguaje hablado? etc? –

Respuesta

25

GeoDjango parece que se adaptará a sus necesidades. No estoy seguro exactamente cómo le gustaría dirigir a los usuarios, pero utilizando el GeoIP API, se 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 

El Docs explicar las cosas con gran detalle; Me tomaría un momento para leerlos a fondo.

+1

sigue siendo la mejor opción para el rastreo GeoIP en 2015? – Coderaemon

+3

Esto ha estado en desuso desde Django 1.9. Use GeoIP2 en su lugar (https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geoip2/) –

3

Un trozo de tarta, y es gratis para muchos usos (pero no para todos).

Vaya a MaxMind.com y siga el friendly instructions. Comenzar a terminar me llevó unos 30 minutos ejecutarlo en una aplicación de Django. Hice una serie de pruebas en IPs conocidas y son muy precisa, incluso en la versión gratuita.

1

Se puede crear una vista que obtiene la IP del usuario y luego emite una redirección HTTP que hará que su navegador para cargar 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') 
    # ... 

Usted puede encontrar la biblioteca SubnetTree para Python útil si quiere probar para ver si una IP está en un bloque en particular.

2

Esta es una solución, desde DjangoSnippets; por cierto, no está seguro de por qué el código de abajo no utiliza urlparse; pero que podría ser fijo :-)

(En cuanto a las otras respuestas, parece que tienes un montón de opciones para elegir. Esta opción no puede ser preferible porque se basa en un servicio de 3 ª parte libre.)

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: WIPmania: "El uso de la API es gratuito para cualquier propósito, personal o empresarial, 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. "

+3

Puede mantener un caché de direcciones IP ya conocidas en alguna parte, sin tener que hurgar en WIPmania cada vez que alguien golpea su sitio. –

25

Ya se mencionó el 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 gratuitas Maxmind, por ejemplo GeoLite City uno.

Ejemplo de uso (casi el mismo que para GeoIP):

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

Definitivamente más fácil de configurar. –

+2

Parece que pygeoip se está moviendo a github: https://github.com/appliedsec/pygeoip – Guerry

+0

Esto era muy práctico para Windows. Altamente recomendado. – cheenbabes