You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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设计原则,若接口涉及数据修改操作,极易导致缓存与实际数据不一致,需谨慎使用。

额外检查项

  1. 确认Redis服务正常运行:执行redis-cli ping,返回PONG说明服务正常
  2. 验证Django缓存连接:在代码中执行cache.set('test', 'hello'),再用redis-cli keys *查看是否存在test键,确认缓存配置生效
  3. 若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:09:31