Подтвердить что ты не робот

Django, Получить IP-адрес

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

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

Спасибо

Изменить: Я хочу, чтобы местоположение на карте было основано на Европе.

4b9b3361

Ответ 1

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 объясняет вещи очень подробно; Я бы потратил минутку, чтобы полностью их прочитать.

Ответ 2

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': '...', ...}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

На основе некоторых бесплатных услуг.

это не быстро, но вы можете добавить больше бесплатных услуг:

настройки:

IPCOUNTRY_APYKEY = [
    {# free tier 2 querys per second
        "url": "http://api.ipinfodb.com/v3/ip-country/?ip={ip}&key={key}&format=json",
        "params": {
            "key": "****************************",
        },
        "fieldname": "countryCode",
    }, 
    {# free tier 1.500 queries per day
        "url": "https://api.ipdata.co/{ip}?api-key={key}",
        "params": {
            "key": "*************************",
        },
        "fieldname": "country_code",
    }, 
    {# free tier 10.000 queries per month and https is not suported in free tier
        "url": "http://api.ipstack.com/{ip}?access_key={key}",
        "params": {
            "key": "********************",
        },
        "fieldname": "country_code",
    },
]

КОД:

import json
import urllib3

from django.conf import settings

for service in settings.IPCOUNTRY_APYKEY:
    url = service["url"].format(ip=ip,**service["params"])
    headers = {'Type': 'django', 'Ver': '1.1.1', 'Connection': 'Close'}
    urllib3.disable_warnings()
    http_call = urllib3.PoolManager()
    try:
        r = http_call.request('GET', url, headers=headers, timeout=1.0)
        if r.status == 200:
            json_response = json.loads(r.data.decode("utf-8"))
            print(json_response[service["fieldname"]])
    except Exception as e:
        pass

return None