Django视图缓存:如何设置缓存至月末到期?
Django 实现缓存至当月月末的视图装饰器
要实现把视图缓存到当月月末的装饰器,不能直接用Django自带的cache_page(它只支持固定超时秒数),得自定义一个装饰器来动态计算到月末的剩余时间,具体实现如下:
1. 导入依赖模块
先引入日期处理工具和Django原生缓存装饰器:
from datetime import datetime import calendar from django.views.decorators.cache import cache_page
2. 自定义缓存装饰器
编写装饰器逻辑,先算出当前时间到当月月末的秒数差,再传递给cache_page:
def cache_page_expire_at_end_of_month(view_func): now = datetime.now() # 获取当月最后一天的日期(精确到23:59:59) last_day = calendar.monthrange(now.year, now.month)[1] last_day_of_month = datetime(now.year, now.month, last_day, 23, 59, 59) # 计算当前到月末的剩余秒数 timeout = (last_day_of_month - now).total_seconds() # 调用原生缓存装饰器完成缓存逻辑 return cache_page(timeout)(view_func)
3. 在视图中使用
直接用自定义装饰器装饰目标视图即可:
@cache_page_expire_at_end_of_month def some_view(request): # 你的视图业务逻辑 return HttpResponse("这是会被缓存到当月月末的内容")
注意事项
- 装饰器会在视图第一次被访问时计算超时时间,跨月后只要视图被访问,就会自动重新计算当月月末的超时时间,无需重启服务。
- 确保已在Django配置文件中正确配置
CACHES(开发环境可使用LocMemCache,生产环境推荐Redis或Memcached)。
内容的提问来源于stack exchange,提问作者Andrej
相关产品推荐
相关产品推荐

