41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
import os
|
|
from django.conf import settings
|
|
import logging
|
|
import subprocess
|
|
from django.core.cache import cache
|
|
|
|
def get_client_ip(request):
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
|
if x_forwarded_for:
|
|
ip = x_forwarded_for.split(',')[0]
|
|
else:
|
|
ip = request.META.get('REMOTE_ADDR')
|
|
return ip
|
|
|
|
def request_to_region(request):
|
|
ip = get_client_ip(request)
|
|
if not ip:
|
|
logging.warning("Cannot get client IP from request: %s" % request)
|
|
return
|
|
return ip_to_region(ip)
|
|
|
|
def ip_to_region(ip):
|
|
ck = 'ip2region.' + ip
|
|
region = cache.get(ck)
|
|
if not region:
|
|
cmd = [os.path.join(settings.BASE_DIR, "scripts/ip2region.py"), ip]
|
|
try:
|
|
out = subprocess.check_output(cmd).decode()
|
|
seen = set()
|
|
locs = []
|
|
for u in out.split('|'):
|
|
us = u.strip()
|
|
if us not in ['', '0', '中国'] and us not in seen:
|
|
seen.add(us)
|
|
locs.append(us)
|
|
region = '-'.join(locs)
|
|
except Exception as e:
|
|
region = "N/A"
|
|
cache.set(ck, region)
|
|
return region
|