2010-02-07 41 views
21

Tôi muốn chuyển hướng người dùng của mình đến các khu vực vị trí cụ thể trong trang web của tôi, bằng cách phát hiện vị trí của họ từ địa chỉ IP của họ.Django, Truy lục vị trí IP

Cách tốt nhất để đạt được điều này trong Django 1.1.1 là gì?

Cảm ơn

Edit: Tôi muốn thành phố định vị dựa trên europe.

+0

Làm thế nào để bạn muốn phân biệt người sử dụng? Dựa trên quốc gia? Trên lục địa? Ngôn ngữ được nói? v.v. –

Trả lời

25

GeoDjango có vẻ như nó sẽ phù hợp với nhu cầu của bạn. Tôi không chắc chắn chính xác như bạn muốn hướng người dùng, nhưng sử dụng GeoIP API, bạn có thể làm điều gì đó như:

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 

Các Docs giải thích mọi thứ rất chi tiết; Tôi sẽ dành một chút thời gian để đọc kỹ chúng.

+1

vẫn là lựa chọn tốt nhất cho Geoip truy tìm trong năm 2015? – Coderaemon

+3

Điều này đã không được chấp nhận kể từ Django 1.9. Thay vào đó, hãy sử dụng GeoIP2 (https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geoip2/) –

3

Miếng bánh và miễn phí cho nhiều (nhưng không phải tất cả) sử dụng.

Đi tới MaxMind.com và theo dõi friendly instructions. Bắt đầu để hoàn thành nó đã cho tôi khoảng 30 phút để có điều này đang chạy trong một ứng dụng Django. Tôi đã thực hiện một số thử nghiệm trên các IP đã biết và chúng là rất chính xác, ngay cả trong phiên bản miễn phí.

1

Bạn có thể tạo ra một cái nhìn mà được IP của người dùng và sau đó phát hành một chuyển hướng HTTP mà sẽ gây ra trình duyệt của họ để tải trang web mà bạn muốn:

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') 
    # ... 

Bạn có thể tìm ra SubnetTree thư viện cho Python hữu ích nếu bạn muốn kiểm tra xem IP có nằm trong một khối cụ thể không.

2

Đây là một giải pháp, từ DjangoSnippets; btw, không chắc chắn lý do mã bên dưới không sử dụng urlparse; nhưng điều đó có thể được cố định :-)

(Nhìn vào câu trả lời khác, có vẻ như bạn có nhiều tùy chọn để lựa chọn. Tùy chọn này có thể không được ưa thích vì nó dựa trên một dịch vụ bên thứ 3 miễn phí.)

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" 

Lưu ý từ WIPmania: "Sử dụng API miễn phí cho mọi mục đích, cá nhân hoặc doanh nghiệp, nếu bạn đang thực hiện ít hơn 10.000 yêu cầu mỗi ngày theo lịch. API đơn giản nhưng mạnh mẽ cho phép bạn truy vấn cơ sở dữ liệu WorldIP bằng một liên kết. "

+3

Bạn có thể duy trì bộ nhớ đệm của các IP đã biết ở đâu đó, do đó không cần phải ping WIPmania mỗi lần ai đó truy cập vào trang web. –

25

GeoIP đã được đề cập, nhưng tôi thấy pygeoip ít phiền toái khi cài đặt và không có trí tuệ nếu bạn muốn nhúng nó vào ứng dụng thay vì cài đặt trong gói trang web của Python. Tuy nhiên, nó hoạt động tốt với cơ sở dữ liệu MaxMind miễn phí, ví dụ: GeoLite City.

Ví dụ về sử dụng (gần như giống nhau như đối với GeoIP):

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

Thiết lập chắc chắn dễ dàng hơn. –

+2

Có vẻ như pygeoip đang chuyển sang github: https://github.com/appliedsec/pygeoip – Guerry

+0

Điều này cực kỳ thiết thực cho Windows. Rất khuyên bạn nên. – cheenbabes

Các vấn đề liên quan