个人博客页面链接: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