专栏首页菲宇Django实现统计网站访问次数、访问 ip 、受访页面

Django实现统计网站访问次数、访问 ip 、受访页面

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/bbwangj/article/details/98869118

想知道网站每天的访问量,都有哪些人访问,都是来自什么地方的访客,都访问了哪些端点。

编写 models.py

# 访问网站的 ip 地址、端点和次数
class UserIP(models.Model):
    ip = models.CharField(verbose_name='IP 地址', max_length=30)
    ip_addr = models.CharField(verbose_name='IP 地理位置', max_length=30)
    end_point = models.CharField(verbose_name='访问端点', default='/', max_length=30)
    count = models.IntegerField(verbose_name='访问次数', default=0)
    
    class Meta:
        verbose_name = '访问用户信息'
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return self.ip
        
# 网站总访问次数
class VisitNumber(models.Model):
    count = models.IntegerField(verbose_name='网站访问总次数', default=0) # 网站访问总次数
    
    class Meta:
        verbose_name = '网站访问总次数'
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return str(self.count)

# 单日访问量统计
class DayNumber(models.Model):
    day = models.DateField(verbose_name='日期', default=timezone.now)
    count = models.IntegerField(verbose_name='网站访问次数', default=0) # 网站访问总次数
    
    class Meta:
        verbose_name = '网站日访问量统计'
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return str(self.day)

使用 geoip2 实现 IP 转换成现实地理位置 安装 geoip2 库

pip install geoip2

下载 Maxmind 网站的 IP 信息库

地址:http://dev.maxmind.com/geoip/geoip2/geolite2

下载完之后,解压,将解压包中的 mmdb 文件复制到项目的应用程序中

下载个GeoLite2 City使用。

然后我们的python代码如下:

#!/usr/bin/python
#-*-coding:utf-8-*-
import geoip2.database
reader = geoip2.database.Reader('./GeoLite2-City.mmdb')
ip = raw_input("输入你要查询的IP:\n")
response = reader.city(ip)
# 有多种语言,我们这里主要输出英文和中文
print("你查询的IP的地理位置是:")

print("地区:{}({})".format(response.continent.names["es"],
                                       response.continent.names["zh-CN"]))

print("国家:{}({}) ,简称:{}".format(response.country.name,
                                                        response.country.names["zh-CN"],
                                                        response.country.iso_code))

print("洲/省:{}({})".format(response.subdivisions.most_specific.name,
                                          response.subdivisions.most_specific.names["zh-CN"]))

print("城市:{}({})".format(response.city.name, 
                                          response.city.names["zh-CN"]))

print("经度:{},纬度{}".format(response.location.longitude,
                                            response.location.latitude))

print("时区:{}".format(response.location.time_zone))

print("邮编:{}".format(response.postal.code))

试一试

(venv) allenwoo@~/renren/code$ python test.py 
输入你要查询的IP:
112.74.207.96
你查询的IP的地理位置是:
地区:Asia(亚洲)
国家:China(中国) ,简称:CN
洲/省:Zhejiang(浙江省)
城市:Hangzhou(杭州)
经度:120.1614,纬度30.2936
时区:Asia/Shanghai
邮编:None

再来一个:

(venv) allenwoo@~/renren/code$ python test.py 
输入你要查询的IP:
223.192.2.165
你查询的IP的地理位置是:
地区:Asia(亚洲)
国家:China(中国) ,简称:CN
洲/省:Beijing(北京市)
城市:Beijing(北京)
经度:116.3883,纬度39.9289
时区:Asia/Shanghai
邮编:None

2.至于在线库的使用是需要一个license_key 只有前面两步不太一样 连接: client = geoip2.webservice.Client(42, <license_key>) 查询 IP: response = client.insights(<IP>)

编写将 IP 转换为现实地理位置的函数

ip_convert_addr.py

import geoip2.database


def ip_to_addr(ip):
    """
    IP 转换成现实中的地理位置
    country = 国家
    province = 省
    city = 城市
    """
    reader = geoip2.database.Reader('blog/GeoLite2-City.mmdb')
    response = reader.city(ip)
    #print(response)
    # 因为有些IP的省份和城市未知,所以设置默认为空
    province = ''
    city = ''
    try:
        # 国家、省份、城市
        country = response.country.names["zh-CN"]
        province = response.subdivisions.most_specific.names["zh-CN"]
        city = response.city.names["zh-CN"]
    except:
        pass
    if country != '中国':
        return country
    if province and city:
        if province == city or city in province:
            return province
        return '%s%s' %(province, city)
    elif province and not city:
        return province
    else:
        return country

编写 visit_info.py 实现更新网站访问量和访问 ip 等信息

from django.utils import timezone

from .models import UserIP, VisitNumber, DayNumber
from .ip_convert_addr import ip_to_addr


# 自定义的函数,不是视图
def change_info(request, end_point):
    """
    # 修改网站访问量和访问 ip 等信息
    # 每一次访问,网站总访问次数加一
    """
    count_nums = VisitNumber.objects.filter(id=1)
    if count_nums:
        count_nums = count_nums[0]
        count_nums.count += 1
    else:
        count_nums = VisitNumber()
        count_nums.count = 1
    count_nums.save()

    # 记录访问 ip 和每个 ip 的次数
    if 'HTTP_X_FORWARDED_FOR' in request.META:  # 获取 ip
        client_ip = request.META['HTTP_X_FORWARDED_FOR']
        client_ip = client_ip.split(",")[0]  # 所以这里是真实的 ip
    else:
        client_ip = request.META['REMOTE_ADDR']  # 这里获得代理 ip
    # print(client_ip)

    ip_exist = UserIP.objects.filter(ip=str(client_ip), end_point=end_point)
    if ip_exist:  # 判断是否存在该 ip
        uobj = ip_exist[0]
        uobj.count += 1
    else:
        uobj = UserIP()
        uobj.ip = client_ip
        uobj.end_point = end_point
        try:
            uobj.ip_addr = ip_to_addr(client_ip)
        except:
            uobj.ip_addr = 'unknown'
        uobj.count = 1
    uobj.save()
    
    # 增加今日访问次数
    date = timezone.now().date()
    today = DayNumber.objects.filter(day=date)
    if today:
        temp = today[0]
        temp.count += 1
    else:
        temp = DayNumber()
        temp.dayTime = date
        temp.count = 1
    temp.save()

将上面的函数导入到视图中,在需要时直接调用

from .visit_info import change_info


...
def post_detail(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    change_info(request, '/')
    # 记得在顶部引入 markdown 模块
    post.body = markdown.markdown(post.body, extensions=['extra', 'codehilite', 'toc',
                                    'tables', 'sane_lists'])
    return render(request, 'post_detail.html', context={'post': post})

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kubernetes-存储卷Volume

    由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题。首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会...

    菲宇
  • Kubernetes监控方案:heapster+influxdb+grafana详解

    Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS。

    菲宇
  • CentOS7.2+OpenStack+kvm 云平台部署--为虚拟机指定固定ip

    openstack在neutron组网模式下默认采用DHCP-Agent模块给虚拟机自动分配ip

    菲宇
  • 烽火2640路由器命令行手册-06-组播协议配置命令

    如果希望对组播报文的处理流程进行跟踪,可使用debug ip mpacket命令。使用此命令的no形式关掉debug信息。

    landv
  • <scapy>刺探星巴克无线网,记录顾客信息

    上网除了需要IP, 还需要Mac地址, Mac与网卡绑定, 记录了设备的Mac, 相当于标记了设备使用者 关于Mac和IP的关系: <讲个故事>为什么IP地址...

    zhaoolee
  • 调用python-nmap实现扫描局域网

    使用环境:Raspberry 3b+ +netifaces+python-nmap+nmap

    py3study
  • python实现主机批量管理

        在日常的运维工作中批量对主机的是很常见的,市面上也有许多主机批量管理的软件,但有时候这些软件并不能完全的满足我们的需求。python中刚好提供了关于主机...

    py3study
  • 关于java

    大整数10进制转16进制问题 google了都没什么好的解决方法,因为要转换的十进制有300多位,long都装不下,没有直接可用的函数可以拿来用 王总的方法分享...

    财主刀刀
  • python 扫描内网存活主机

    py3study
  • python脚本修改hosts文件

    记一次使用python脚本来修改hosts文件,由于公司服务器需要换ip地址,服务器里都是Linux系统,而hosts文件中有些解析的ip,手动一台一台的解析太...

    py3study

扫码关注云+社区

领取腾讯云代金券