站点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中增加下区域的显示,就可以一目了然的知道是哪个地区的访问了。

<