网站用户访问量统计—Django

最近准备弃用Django自带的admin,将个人博客网站接入hadmin后台模板,同时想要实现用户访问量统计功能。在网上查了一下具体实现方法。众说纷纭,有接入第三方的、有js实现的、有后端代码实现的,第三方的话很简单,在前端页面上加入几行代码就可以了,但是查询访问量的时候貌似需要登录第三方网站才能查询,而我想要实现在网站上展示这些数据,其次安全性也是一个大问题,本着能造车轮就不闲着的原则,我自己动手写了一个简单的访问量统计功能,包括当日用户量、总用户量。同时添加了ip过滤功能——即同一ip同一天内访问多次时在后端只记录一次。

实现思路:

在数据库中建立两张数据表,分别存放总用户访问量和当日访问用户IP地址,找到一个用户访问网站大概率会经过的页面,在其后端代码中加上相应的功能代码。用户每访问一次该页面,后台获取用户IP地址,再拿该地址到数据库中比对查看是否已有数据,有的话不执行操作,否则将该IP地址存到数据库中(实现同一IP多次访问记录一次)。

实现代码:

model文件中创建两个表

class Website_views(models.Model):
    """
    网站访问量统计表:字段ID、总访问量
    """
    nid = models.AutoField(primary_key=True)
    views = models.IntegerField()


class view_ip(models.Model):
    """
    最近访问用户IP:字段ID、用户IP
    """
    nid = models.AutoField(primary_key=True)
    user_ip = models.CharField(max_length=15, null=False)
    create_time = models.DateTimeField(auto_now_add=True)

将访问量统计功能封装成对应的函数

def get_user_ip(request):
    if 'HTTP_X_FORWARDED_FOR' in request.META:        # 获取用户真实IP地址
        user_ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        user_ip = request.META['REMOTE_ADDR']
    obj = models.view_ip.objects.first()
    if not obj == None:                                # 判断数据表是否为空
        ct = obj.create_time
        if not ct.month == dt.datetime.now().month or not ct.day == dt.datetime.now().day:      # 判断表中数据是否为当日访问
            objs = models.view_ip.objects.all()         # 不是当日访问则迭代删除表中数据
            for i in objs:
                i.delete()
        if not models.view_ip.objects.filter(user_ip=user_ip):  # 判断当日用户是否已经访问过本网站
            models.view_ip.objects.create(user_ip=user_ip)  # 将用户IP存入数据库
            total_views_add()                         # 网站总访问量+1
    else:
        # print(user_ip)
        models.view_ip.objects.create(user_ip = user_ip)
        total_views_add()


def total_views_add():
    obj = models.Website_views.objects.first()
    if obj == None:
        models.Website_views.objects.create(views=1)
    else:
        total_views = models.Website_views.objects.first()
        total_views.views = total_views.views + 1
        total_views.save()

当日访问用户IP地址表中的数据并不一定是当日的,因为假如8月5日有10个用户访问该网站,此时表中数据是这10个用户的IP地址,8月6日当有用户访问时,数据库中的数据还是8月5日的这个时候就要对数据进行有效判断,具体操作是每次有用户访问时都取数据表中第一条数据和datatime.now(获取当前时间),判断两者的month和day是否相等,相等则是同日内访问的有效数据,不相等则说明该用户是当天第一个访问本网站的用户,然后删除表中所有数据并将该用户IP地址存入表中。

在对应函数中调用功能函数
网站用户访问量统计—Django_第1张图片

效果展示:

在局域网下分别通过主机、ipad、手机多次登录网站

view_ip表

网站用户访问量统计—Django_第2张图片

Website_views表

Website_views表数据展示
关于前端展示部分还没有实现,思路很简单获取总访问量直接取表中数据即可,获取当日访问量需要先进行数据有效判断,再统计表中数据的字段总数count。

注:

由于改版后的网站还未上线,只能在局域网下进行简单的测试,所以代码中可能还存在一些未知的bug。在网站上线后将进行系统测试并修复bug。
Website_views表中只有一条记录,这样看来有些大材小用。其实也可以在static文件中创建一个txt文档用于保存总访问量数据,通过python对文本进行读写来模拟操作数据库,不过在代码上会稍微麻烦一些。
原文地址: https://www.jhxblog.cn/article/?articleid=7

你可能感兴趣的:(网站开发,访问量,Django,个人博客,python)