如何在Django中使cache_page失效?

2024-06-26

问题是:我有博客应用程序,并且我将帖子输出视图缓存了 5 分钟。

@cache_page(60 * 5)
def article(request, slug):
    ...

但是,每当向帖子中添加新评论时,我想使缓存失效。 我想知道如何最好地做到这一点?

我见过this https://stackoverflow.com/questions/2268417/expire-a-view-cache-in-django相关问题,但它已经过时了。


这是我在寻找解决方案时遇到的第一个打击,而当前的答案并不是很有帮助,所以在大量研究 Django 的源代码之后,我有了这个问题的答案。

是的,您可以通过编程方式知道密钥,但这需要一些工作。

Django 的页面缓存通过引用来工作request对象,特别是请求路径和查询字符串。这意味着对于具有不同查询字符串的页面的每个请求,您将拥有不同的缓存键。在大多数情况下,这不太可能成为问题,因为您想要缓存/无效的页面将是一个已知的字符串,例如/blog/my-awesome-year,所以要使这个无效,你只需要使用 Django 的RequestFactory:

from django.core.cache import cache
from django.test import RequestFactory
from django.urls import reverse
from django.utils.cache import get_cache_key


cache.delete(get_cache_key(RequestFactory().get("/blog/my-awesome-year")))

如果您的 URL 是固定值列表(即没有不同的查询字符串),那么您可以在此停止。但是,如果您有很多不同的查询字符串(例如?q=xyz对于搜索页面或其他内容),那么最好的选择可能是为每个视图创建一个单独的缓存。然后你就可以通过cache="cachename" to cache_page()然后使用以下命令清除整个缓存:

from django.core.cache import caches


caches["my_cache_name"].clear()

关于此策略的重要说明

它只真正适用于未经验证的页面。用户登录的那一刻,cookie 数据就成为缓存密钥创建过程的一部分,因此以编程方式重新创建该密钥变得更加困难。我想你可以尝试从会话存储中提取 cookie 数据,但可能会有数千那里有很多键,您必须使它们中的每一个都失效/预先缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Django中使cache_page失效? 的相关文章

随机推荐

  • 如何正确调用 LsaLogonUser 进行交互式登录?

    我正在尝试使用 LsaLogonUser 创建交互式登录会话 但它总是返回STATUS INVALID INFO CLASS 0xc0000003 从网上查到的内存布局KERB INTERACTIVE LOGON结构很棘手 但我很确定我做得
  • 将环境变量从 fastlane 传递到 Xcode 构建阶段脚本

    是否可以 如果可以 如何 将环境变量从运行 fastlane 的脚本传递到 Xcode 运行脚本阶段 我的最终目标是在运行脚本阶段读取当前的 git 分支名称 我们的 CI 由 Team Foundation Server 运行 它执行以下
  • ListView选择单个项目,wpf

    我有一个列表视图 它的项目源是一个列表 我希望用户只选择一项 当我将列表视图的 SelectionMode 设置为 single 时 用户仍然可以选择多个项目 并且列表视图似乎变得疯狂并选择用户未选择的项目 看起来很奇怪 任何人都知道可能是
  • 捕获非特定异常(例如 System.Exception)是一种不好的做法吗?为什么?

    我目前正在进行代码审查 下面的代码让我跳了起来 我发现这段代码存在多个问题 你是否同意我的观点 如果是这样 我该如何向我的同事解释这是错误的 顽固型 捕获一般异常 Exception ex 使用 if ex 是某物 而不是另一个 catch
  • CSS 底部边框悬停“抖动”

    我有一个导航栏 当您将鼠标悬停在导航按钮上时 我想给它一个橙色的底部边框 唯一的问题是 每当您悬停时 边框都会使内容 导航按钮 抖动 这是不应该的 另外 我的导航栏上已经有一个黑色的底部边框 因此无法更改它 HTML div ul li a
  • 关闭表单多选按钮单击 vuejs

    我有 vue 材质多选的 html 设计 我希望单击按钮即可关闭多选选项 Here is my design 我试过这个 methods selectAgents this refs selectAgent el children 0 cl
  • 数据库设计:循环依赖

    想象一下以下数据库 表 companies 包含字段 id name 和旗舰产品 ID 表 products 有字段 id name 和 company id 一家公司必须有一款旗舰产品 1 1关系 所有产品都有一个公司 1 N关系 当使用
  • 如何找出在哪个提交中添加了特定代码?

    我想知道我在哪个提交中添加了下面给出的代码 if getListView getChildCount 0 getActivity findViewById android R id empty setVisibility View VISI
  • 为什么我的 Delphi FindDialog 中的光标没有变成沙漏形?

    我只是用以下命令打开 FindDialog FindDialog Execute 在我的 FindDialog OnFind 事件中 我想将光标更改为沙漏以搜索大文件 这可能需要几秒钟 所以在 OnFind 事件中我这样做 Screen C
  • C# 如何判断单元格中的公式是否有错误

    在 Excel 公式中 您可以使用 ISERR A1 or ISERROR A1 在 VBA 宏中 您可以使用IsError sheet Cells 1 1 但是使用 VSTO Excel Addin 项目我没有在 Microsoft Of
  • Delphi XE3,丑陋的 StringGrid 边框

    与 Delphi 7 相比 为什么 XE3 中的 String Grid 边框如此不清晰 如何解决这个问题 Delphi 2010 之后所有的网格都是主题化的 要在网格上禁用新主题 您必须设置属性 在对象检查器中将 DrawingStyle
  • Z3:消除不关心的变量

    我有一个 test smt2 文件 set logic QF IDL declare const a Int declare const b Int declare const c Int assert or lt a 2 lt b 2 c
  • 动态更新 spring bean。是否可以?

    如果 spring bean 配置发生变化 有没有办法动态更新 Spring bean 例如 假设我有一个具有布尔属性的 spring beanx春豆有其价值true当应用程序启动时 所以 spring 创建了具有该属性的 beanx设置为
  • scikit-learn 中跨多列的标签编码

    我正在尝试使用 scikit learnLabelEncoder对 pandas 进行编码DataFrame字符串标签 由于数据框有许多 50 列 我想避免创建LabelEncoder每列的对象 我宁愿只拥有一件大的LabelEncoder
  • 如何在 Ubuntu 16.04 上设置 Docker + PhpStorm + xdebug

    我的问题是当我开始监听端口时 xdebug 不起作用 我认为 PhpStorm 无法与 xdebug 链接 我刚刚得到调试器面板变量不可用 看来 xdebug 没有正确设置 使用的软件及版本 Ubuntu 16 04 LTS Docker
  • iOS 64 位 @try {... } @catch {...} 不起作用

    我有一个非常特殊的问题 最近 我向我的 iOS 项目 arm64 添加了 64 位支持 从那时起 我开始收到内部代码段未捕获的异常 try catch 我使用 Crashlytics 进行崩溃报告 我设法在应用程序中的任何位置使用以下代码行
  • Entity Framework Core - 在 Queryable 中使用扩展方法

    我有以下查询 db Users AsQueryable Where u gt u Id userResolver LoggedUserId u Packages Where p gt p StatusId int PackageStatus
  • C++ 从一组点进行平面插值

    我正在使用 PCL 点云 库用 C 进行编程 我的问题是 计算某些点的方差 但仅相对于平面的垂直轴 我会解释一下自己 所以我正在做的是将点云按表面平滑度划分为多个片段 区域生长分割 http pointclouds org document
  • 从另一个表复制权限

    是否可以将用户权限从 PostgreSQL 数据库中的一个表复制到另一个表 是不是只要更新一下就可以了pg class relacl将目标表的列值替换为源表的值 如下所示 UPDATE pg class SET relacl SELECT
  • 如何在Django中使cache_page失效?

    问题是 我有博客应用程序 并且我将帖子输出视图缓存了 5 分钟 cache page 60 5 def article request slug 但是 每当向帖子中添加新评论时 我想使缓存失效 我想知道如何最好地做到这一点 我见过this