在线人数

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 这个过程要放到中间层中的 
# 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

什么是 utf8mb4

utf8mb4 是 utf8 的超集,理论上原来使用 utf8,然后将字符集修改为 utf8mb4,也不会对已有的utf8 编码读取产生任何问题。