Django中使用@login_required时如何缓存认证信息及排查高TTFB问题
@login_required 认证缓存实现方案
Django默认的认证逻辑每次请求都会查询用户表,触发@login_required装饰器校验时会发起数据库查询,可以通过自定义认证后端的方式缓存用户信息,步骤如下:
- 首先配置Django缓存后端,推荐使用Redis作为缓存存储。
- 自定义认证后端,重写用户查询逻辑加入缓存处理:
from django.contrib.auth.backends import ModelBackend from django.core.cache import cache from django.contrib.auth import get_user_model User = get_user_model() class CachedAuthBackend(ModelBackend): def get_user(self, user_id): cache_key = f"auth_user_{user_id}" user = cache.get(cache_key) if not user: try: user = User.objects.get(pk=user_id) # 缓存有效期15分钟,可根据业务需求调整 cache.set(cache_key, user, 60 * 15) except User.DoesNotExist: return None return user
- 修改
settings.py中的认证后端配置,优先级设置为自定义的认证后端:
AUTHENTICATION_BACKENDS = [ "你的应用路径.CachedAuthBackend", "django.contrib.auth.backends.ModelBackend", ]
- 配置用户信息更新时自动清除缓存,避免缓存数据过期:
from django.core.cache import cache from django.db.models.signals import post_save from django.dispatch import receiver from django.contrib.auth import get_user_model User = get_user_model() @receiver(post_save, sender=User) def clear_user_cache(sender, instance, **kwargs): cache.delete(f"auth_user_{instance.pk}")
同时建议将Django默认的Session存储改为缓存模式,进一步减少数据库查询,修改settings.py配置:
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
AWS环境TTFB过高的可能原因
- 网络延迟问题:应用服务器和AWS托管数据库(如RDS)不在同一可用区,甚至跨区域部署,单次数据库查询的网络开销大幅增加,是TTFB升高的核心常见原因。
- 数据库连接复用缺失:Django默认未开启数据库连接复用,每次请求都需要重新和RDS建立连接,三次握手+认证的开销叠加网络延迟,会显著拉长响应时间,可通过配置
settings.py中的CONN_MAX_AGE参数开启连接复用。 - 数据库实例性能不足:RDS实例的CPU、内存、IOPS达到瓶颈,查询响应速度远低于本地数据库。
- 缓存配置异常:AWS环境缓存配置未生效,所有请求仍全部走数据库查询,多请求叠加后响应时间达到1秒级别。
- 额外网络层开销:AWS部署链路中的WAF、负载均衡、安全组校验等额外处理逻辑,也会增加TTFB的耗时。
内容的提问来源于stack exchange,提问作者Joao Antunes
相关产品推荐
相关产品推荐

