themblem/api/api/products/ip2region.py
2024-09-01 21:51:50 +01:00

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