Django @cache_page装饰器未生成缓存问题排查求助
Django @cache_page 不生成缓存键的问题解决
核心原因
@cache_page 装饰器默认只对GET和HEAD请求生效,POST请求属于通常带有修改资源副作用的请求,Django默认不会为其触发缓存逻辑,这就是你Redis里始终看不到缓存键的直接原因。
解决方案
方案1:改用GET请求(推荐)
如果你的接口仅用于获取数据、无服务器状态修改操作,遵循REST规范将请求方法改为GET,@cache_page就能正常工作:
@api_view(['GET']) @cache_page(60*1) def sawan_ko_jhari(request): data = request.GET.get('name') return JsonResponse({"success": True, "data": data}, safe=False)
发送GET请求后,Redis中会自动生成对应的缓存键。
方案2:手动实现POST请求缓存(需谨慎)
如果业务上必须使用POST请求,可以手动编写缓存逻辑,自行控制缓存键与缓存行为:
from django.core.cache import cache from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['POST']) def sawan_ko_jhari(request): # 根据请求体生成唯一缓存键(注意:若请求体过大或含敏感数据,需调整键生成逻辑) cache_key = f"sawan_cache:{request.body.decode('utf-8')}" cached_data = cache.get(cache_key) if cached_data: return Response(cached_data) # 执行请求处理逻辑 data = request.data.get('name') response_data = {"success": True, "data": data} # 将响应存入缓存,有效期60秒 cache.set(cache_key, response_data, 60) return Response(response_data)
⚠️ 注意:缓存POST响应可能违反REST设计原则,若接口涉及数据修改操作,极易导致缓存与实际数据不一致,需谨慎使用。
额外检查项
- 确认Redis服务正常运行:执行
redis-cli ping,返回PONG说明服务正常 - 验证Django缓存连接:在代码中执行
cache.set('test', 'hello'),再用redis-cli keys *查看是否存在test键,确认缓存配置生效 - 若Redis设置了密码,需在缓存配置中添加密码参数:
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PASSWORD': 'your_redis_password' # 新增密码配置 } } }
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

