最近准备弃用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地址存入表中。
在局域网下分别通过主机、ipad、手机多次登录网站
关于前端展示部分还没有实现,思路很简单获取总访问量直接取表中数据即可,获取当日访问量需要先进行数据有效判断,再统计表中数据的字段总数count。
由于改版后的网站还未上线,只能在局域网下进行简单的测试,所以代码中可能还存在一些未知的bug。在网站上线后将进行系统测试并修复bug。
Website_views表中只有一条记录,这样看来有些大材小用。其实也可以在static文件中创建一个txt文档用于保存总访问量数据,通过python对文本进行读写来模拟操作数据库,不过在代码上会稍微麻烦一些。
原文地址: https://www.jhxblog.cn/article/?articleid=7