站点IP对应地区转换
类别: 入门到放弃
标签:
Django
日期: 2024-02-25 | 作者:admin |
浏览: 75
前几天增加了站点访问次数功能,但只记录了IP地址,不清楚这个IP是哪里的,每次都好奇想着知道下,因此想着直接记录时候就转换为相应的地区就好了。
查了下资料,发现有个Ip2region 很给力,记录下相关改进。
完善model
# 站点访问信息
class VisitInfo(models.Model):
visit_time = models.DateTimeField('访问时间', default=timezone.now)
ip = models.CharField('访问IP', max_length=50)
# 新增区域字段
area = models.CharField('访问区域', max_length=50)
browser = models.CharField('浏览器', max_length=200)
class Meta:
verbose_name = '站点访问信息列表'
verbose_name_plural = verbose_name
db_table = 'blog_visit_info'
ordering = ('-visit_time',)
def __str__(self):
return self.ip
添加功能
from .xdbSearcher import XdbSearcher
# 根据IP获取地址
def get_ip_area(ip):
# 1. 预先加载整个 xdb (!!需提前下载好文件,并指定相应目录!!)
dbPath = Path(__file__).resolve().parent.parent / "ip2region.xdb"
cb = XdbSearcher.loadContentFromFile(dbfile=dbPath)
# 2. 仅需要使用上面的全文件缓存创建查询对象, 不需要传源 xdb 文件
searcher = XdbSearcher(contentBuff=cb)
# 3. 执行查询
ip = ip
try:
region_str = searcher.search(ip)
# 有碰到解析出错,好像是IP6的原因
except OSError:
region_str = 'unknown'
# 4. 关闭searcher
searcher.close()
return region_str
# 记录访问IP及区域
def visit_count(request):
ipinfo = request.META.get('HTTP_X_FORWARDED_FOR')
browser = request.META.get('HTTP_USER_AGENT', 'unknown')
if ipinfo:
ip = ipinfo.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
# IP对应区域
area = get_ip_area(ip)
# 2小时内重复IP不统计
time_interval = timezone.now() - timedelta(hours=2)
have = VisitInfo.objects.filter(ip=ip).filter(visit_time__gte=time_interval)
if have:
pass
else:
VisitInfo.objects.create(visit_time=timezone.now(), ip=ip, area=area, browser=browser)
然后在admin中增加下区域的显示,就可以一目了然的知道是哪个地区的访问了。