个人博客页面链接:http://www.shihao.online(django搭建的个人博客,目前还在完善中)
写完博客网站之后,需要加一些统计信息,比如统计访问用户总访问量,统计日访问量,或者统计用户ip地址和该ip地址的访问次数
先看效果
下面我自己写的models
models.py
from django.utils import timezone
#访问网站的ip地址和次数
class Userip(models.Model):
ip=models.CharField(verbose_name='IP地址',max_length=30) #ip地址
count=models.IntegerField(verbose_name='访问次数',default=0) #该ip访问次数
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)
我的想法是定义一个函数(装饰器也可以,高大上一点),实现更新网站访问量和访问ip等信息,在视图中调用,实现所有功能
from .models import *
from django.utils import timezone
#自定义的函数,不是视图
def change_info(request): #修改网站访问量和访问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))
if ip_exist: # 判断是否存在该ip
uobj = ip_exist[0]
uobj.count += 1
else:
uobj = Userip()
uobj.ip = client_ip
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()
如下图所示,将函数导入到视图中,在需要的地方调用函数
追加:此教程只适合简单页面访问量统计,不适合统计高并发页面访问量,而且会降低部分性能,至于高并发页面访问量统计,可以参考这个https://blog.csdn.net/wushuchu/article/details/52036753