我的博客搭建之Django实现网站在线人数统计功能

  • 文章
  • 作者:Hubery
  • 发布时间:2019-05-31
  • 阅读数:3585
  • 分类:博客搭建
  • 标签: Django

       实现网站在线人数统计

这个主要是统计一分钟之内的在线人数的统计,数据保存在cache中。

实现逻辑是,当一个用户访问,把用户的ip作为key放到cache中,然后设置online_ips 作为key来存放所有的ip,每次请求会先取出online_ips 的所有值,任何在根据这个list 来从cache中取出依然存在的ip,再次存入online_ips。

实现代码:

# 这个过程要放到中间层中的 
# PV_middleware.py
from django.core.cache import cache
from django.utils.deprecation import MiddlewareMixin

# EXLCLE_URL 这个是排除一些路由不进行统计的 比如
# EXLCLE_URL = ['/admin/']
from HuberyBlog.settings import EXCLUDE_URL 

# 主要在settings 中添加这个中间件
class PvVisitViewMiddleware(MiddlewareMixin):
    """统计在线人数和用户访问"""
    def process_request(self, request):
        if request.path not in EXCLUDE_URL:
            ip = get_ip(request)
            online_ips = cache.get("online_ips", [])
            if online_ips:
              # 根据取出的ip list获取缓存中仍然存在的ip
              # 这里要加个list py2 中是直接获取的list python3中获取的是一个对象 网上很多都没加
                online_ips = list(cache.get_many(online_ips).keys())
            cache.set(ip, 0, 1 * 60)
            if ip not in online_ips:
                online_ips.append(ip)
            cache.set("online_ips", online_ips)

def get_ip(request):
    """
    获取ip
    :param request:
    :return:
    """
    if 'HTTP_X_FORWARDED_FOR' in request.META:
        ip = request.META.get('HTTP_X_FORWARDED_FOR')
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


# views.py 
# 获取在线人数方法

from django.core.cache import cache
from django.http import JsonResponse

def online_ips(request):
    online_ips = cache.get("online_ips", [])
    online_ips_num = 0
        if online_ips:
            online_ips_num = len(online_ips)
   return JsonResponse({'online_ips_num': online_ips_num})



评论列表
  123 (2020-01-10 16:58): 回复
    132

  冯小贤 (2019-06-06 00:50): 回复
    不知道是不是因为梯子的原因,几秒钟进来没卡过
塞法(2019-06-06 09:49) 回复 冯小贤: 回复
是对方

  smartwu_sir (2019-06-05 22:08): 回复
    厉害啊,界面真好看
Hubery(2019-06-06 15:04) 回复 smartwu_sir: 回复
嘿嘿! 谢谢

  测试 (2019-06-05 19:52): 回复
    <script>alert('hello');</script>

  测试 (2019-06-05 17:32): 回复
    <b>测试</b>

  焚梏 (2019-06-05 17:17): 回复
    测试
呵呵(2019-06-05 17:32) 回复 焚梏: 回复
999

新的评论