Django, Получите местоположение IP

Я хотел бы перенаправить своих пользователей к определенным областям местоположения в моем веб-сайте путем обнаружения их местоположения от их IP-адреса.

Каков был бы лучший способ достигнуть этого при Django 1.1.1?

Спасибо

Править: Я хочу город базирующийся locationing на Европе.

24
задан Hellnar 7 February 2010 в 20:28
поделиться

5 ответов

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

DocsDocs объясняет вещи очень подробно; я бы потратил немного времени, чтобы детально их прочитать.

33
ответ дан 28 November 2019 в 22:40
поделиться

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': '...', ...}
25
ответ дан 28 November 2019 в 22:40
поделиться

Кусок торта, и это бесплатно для многих (но не для всех) пользователей. .

Перейдите на MaxMind.com и следуйте дружественным инструкциям . От начала до конца мне потребовалось около 30 минут, чтобы запустить это в приложении Django. Я сделал несколько тесты на известных IP-адресах, и они очень точны даже в бесплатной версии.

3
ответ дан 28 November 2019 в 22:40
поделиться

Это одно из решений из DjangoSnippets; btw, не уверен, почему в коде ниже не используется 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: "Использование API бесплатно для любых целей, личных или деловых, если вы делаете менее 10.000 запросов в календарный день. Простой, но мощный API, позволяющий делать запросы к базе данных WorldIP по одной ссылке"

.
2
ответ дан 28 November 2019 в 22:40
поделиться

Вы можете создать представление, которое получает 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 в конкретном блоке.

1
ответ дан 28 November 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: