在Django Mezzanine中,如何防止在page_processor上进行缓存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django Mezzanine中,如何防止在page_processor上进行缓存?相关的知识,希望对你有一定的参考价值。

通过以下内容,我创建了一个处理发布请求的页面。

Mezzanine 4.2.3 Django 1.10.8 Python 2.7.10 PostgreSQL 9.6.3 Darwin 17.4.0

这是我的Page的models.py

from mezzanine.pages.models import Page
from django.db import models

class MyCustomPage(Page):
    a_field = models.CharField(max_length=100)

这是我的Page的page_processors.py

from django.views.decorators.cache import never_cache
from django.contrib import messages
from .forms import MyCustomForm
from .utils import do_something_specific
from .models import MyCustomPage
from mezzanine.pages.page_processors import processor_for
from django.shortcuts import redirect


@never_cache
@processor_for(MyCustomPage)
def my_custom_page(request, page):

    if request.method == "POST":
        form = MyCustomForm(request.POST)

        if form.is_valid():
            do_something_specific(form.cleaned_data)
            messages.success(request, "Your post request was a success!")
            return redirect(page.get_absolute_url())

        else:
            return {
                "form": form,
            }

    else:  # is GET request
        return {
            "form": MyCustomForm(),
        }

@never_cache装饰器似乎阻止python代码被缓存,但模板正在被缓存。意思是,如果我发布到网址,它将调用do_something_specific(form.cleaned_data),这将发生,甚至似乎设置messages.success。但是当我下次在页面上执行常规get请求时,它将使用缓存模板并且messages.success消息将在那里。

对于它的价值,我使用redis作为我的缓存后端。我使用memcached但得到了相同的结果。我将缓存用于我的应用程序的不同部分。另外,我对缓存非常熟悉。我在我的所有应用程序中都经常使用它。这似乎与夹层缓存有关。

理想情况下,我只是想完全禁用夹层缓存,只缓存我明确告诉它缓存的内容,没有别的。

更新:

@iamkhush是的,使用redis-server monitor我可以验证密钥是否相同。这就是我的工作。清除缓存。 RUNSERVER。在浏览器中获取URL。缓存不存在,因此它呈现模板并将其设置在缓存中。然后,我填写表格和POST。 page_processor运行我的“if POST”块中的所有代码。然后它进入缓存并使用存在的密钥进行GET。因此,它不是重新渲染模板,而是获取缓存中的任何内容,因此成功消息不会进入模板。我刷新了几次,它获得相同的密钥。所以我清除缓存,运行服务器,访问URL,没有缓存,因此模板被呈现并且它获取成功消息,然后html在缓存中设置。如果我刷新(重新GET)url,它将从缓存中检索模板。

答案

我认为这是因为中间件mezzanine.core.middleware.FetchFromCacheMiddlewaremezzanine.core.middleware.UpdateCacheMiddleware的结果

在这里检查一下 - http://mezzanine.jupo.org/docs/caching-strategy.html#cache-middleware

您应该删除这些以获得所需的结果

以上是关于在Django Mezzanine中,如何防止在page_processor上进行缓存?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用自定义用户和 Mezzanine/South 登录到 Django Admin

Mezzanine

如何在 django 中防止 XSS 攻击

如何防止“+”在 Django request.POST 方法中转换为空格?

Mezzanine 可以在用户注册时向管理员发送电子邮件吗?

Mezzanine (Windows10下)安装配置与修改(更新中)