当然可以!下面是一个示例的代码,使用Redis作为缓存来统计PV(页面访问量)和UV(独立访客数),并对接口进行限流:
```python
import time
import redis
from flask import Flask, request
app = Flask(__name__)
redis_client = redis.Redis(host='localhost', port=6379)
# 限流装饰器
def rate_limit(key_prefix, limit, expire):
def decorator(f):
def wrapper(*args, **kwargs):
key = f"{key_prefix}:{request.remote_addr}"
count = redis_client.get(key)
if count is None:
count = 1
redis_client.setex(key, expire, count)
else:
count = int(count)
if count >= limit:
return "访问过于频繁,请稍后再试!"
count += 1
redis_client.setex(key, expire, count)
return f(*args, **kwargs)
return wrapper
return decorator
@app.route('/')
@rate_limit(key_prefix='pv', limit=100, expire=60) # 限流配置:每分钟最多允许100次访问
def index():
# 统计PV
redis_client.incr('pv')
# 统计UV
user_ip = request.remote_addr
today = time.strftime('%Y-%m-%d', time.localtime())
uv_key = f"uv:{today}"
redis_client.sadd(uv_key, user_ip)
return "Hello World!"
@app.route('/stats')
def stats():
# 获取PV
pv = redis_client.get('pv') or 0
# 获取UV
today = time.strftime('%Y-%m-%d', time.localtime())
uv_key = f"uv:{today}"
uv = redis_client.scard(uv_key)
return f"PV: {pv}, UV: {uv}"
if __name__ == '__main__':
app.run()
```
在上面的代码中,`rate_limit` 是一个装饰器函数,用于限制接口访问频率。在 `index` 函数中,添加了 `@rate_limit` 装饰器,并传入了限流的配置参数,即每分钟最多允许100次访问。使用 Redis 来记录每个IP的访问次数,当访问次数超过限制时,返回错误消息。
在 `index` 函数中,会自动统计 PV(页面访问量)的数量,通过 `redis_client.incr('pv')` 来自增计数。同时,会统计 UV(独立访客数)的数量,将每个访客的 IP 添加到 `uv:{today}` 的 Redis 集合中,并使用 `redis_client.scard` 获取集合的基数(即不重复的元素个数)作为 UV 数量。
在 `/stats` 接口中,可以获取 PV 和 UV 的统计结果。
请注意,上述代码只是一个简单示例,实际情况下可能需要更复杂的逻辑来处理访问量统计和限流的问题,具体实现可以根据实际需求进行调整。