【Django3.0功能开发】apps篇:views中网站访问的IP记录通用方法

内容介绍

通常在新闻管理平台中需要记录访问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()

效果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/110817222