内容介绍
通常在新闻管理平台中需要记录访问IP的对应数据信息并进行统计汇总,这里列举一些方法。
models.py
# 网站总访问次数
class TotalVisitNumber(models.Model):
total_count = models.IntegerField(verbose_name='网站访问总次数', default=0) # 网站访问总次数
class Meta:
verbose_name = '网站访问总次数'
verbose_name_plural = verbose_name
def __str__(self):
return str(self.total_count)
# 每日访问次数统计
class EveryDayVisitNumber(models.Model):
date = models.DateField(verbose_name='统计日期', default=timezone.now)
visit_count = models.IntegerField(verbose_name='统计次数', default=0) # 网站访问总次数
class Meta:
verbose_name = '网站日访问量统计'
verbose_name_plural = verbose_name
def __str__(self):
return str(self.date)
# 记录访问IP和对应的Part
class EveryVisitIpPart(models.Model):
visit_ip = models.CharField(verbose_name='网站访问IP地址', max_length=30)
visit_part = models.CharField(verbose_name='访问的模块内容', max_length=30)
class Meta:
verbose_name = '访问IP记录明细'
verbose_name_plural = verbose_name
def __str__(self):
return self.visit_ip
# 记录访问IP的总数
class EveryVisitIpCount(models.Model):
visit_ip = models.CharField(verbose_name='网站访问IP地址', max_length=30)
visit_count = models.IntegerField(verbose_name='对应IP访问次数', default=0)
class Meta:
verbose_name = '访问IP记录汇总'
verbose_name_plural = verbose_name
def __str__(self):
return self.visit_ip
views.py
from visit_statistics import *
# 定义全部文章获取方式info
class ArticleInfoListViewSet(viewsets.GenericViewSet):
......
# 记录IP 在源码处添加VisitStatistics
def list(self, request, *args, **kwargs):
VisitStatistics(request, "ArticleInfo")
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
visit_statistics.py
from .models import *
from django.utils import timezone
# 自定义的函数,不是视图
def VisitStatistics(request, part):
# 每一次访问,网站总访问次数加一
count_nums = TotalVisitNumber.objects.filter(id=1)
if count_nums:
count_nums = count_nums[0]
count_nums.total_count += 1
else:
count_nums = TotalVisitNumber()
count_nums.total_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
# 记录访问IP和对应的Part
VisitIpPart = EveryVisitIpPart()
VisitIpPart.visit_ip = str(client_ip)
VisitIpPart.visit_part = part
VisitIpPart.save()
# 记录访问IP的总数
ip_exist = EveryVisitIpCount.objects.filter(visit_ip=str(client_ip))
if ip_exist: # 判断是否存在该ip
uobj = ip_exist[0]
uobj.visit_count += 1
else:
uobj = EveryVisitIpCount()
uobj.visit_ip = client_ip
uobj.visit_count = 1
uobj.save()
# 增加今日访问次数
date = timezone.now().date()
today = EveryDayVisitNumber.objects.filter(date=date)
if today:
temp = today[0]
temp.visit_count += 1
else:
temp = EveryDayVisitNumber()
temp.dayTime = date
temp.visit_count = 1
temp.save()
效果演示