Django 中间件如何实现限速和限流?
限速和限流都是通过中间件来实现的。
限速中间件可以控制每个用户的请求频率,防止用户过多访问服务器。可以使用 Django 自带的 cache 缓存来实现。下面是一个示例:
from django.core.cache import cache class ThrottleMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 从 cache 中获取当前用户访问次数,没有则初始化为 0 count = cache.get(request.META.get('REMOTE_ADDR'), 0) # 判断用户请求是否过度,如过度则返回 429 Too Many Requests if count >= 60: return HttpResponse('Too Many Requests', status=429) # 增加用户访问次数,并将结果缓存 1 分钟 count += 1 cache.set(request.META.get('REMOTE_ADDR'), count, 60) # 继续处理请求 response = self.get_response(request) return response
限流中间件可以控制全局请求速率,防止服务器过载。可以使用第三方库 django-speedinfo 来实现。下面是一个示例:
from django_speedinfo.middleware import SpeedMiddleware class RateLimitMiddleware(SpeedMiddleware): def __init__(self, get_response): super().__init__(get_response) def process_request(self, request): super().process_request(request) # 如果全局请求速度过快,则暂停 1 秒 if self.current_speed > 300: time.sleep(1)
以上示例中,ThrottleMiddleware 中的每个 IP 地址每分钟最多访问 60 次,如果超过则返回 429 错误;RateLimitMiddleware 限制了全局的请求速率不得超过每秒 300 次,如果超过则暂停 1 秒。
相关文章