在 Django Mezzanine 中,如何防止在 page_processor 上进行缓存?
In Django Mezzanine, how to I prevent caching on a page_processor?
通过以下内容,我创建了一个处理 post 请求的页面。
夹层 4.2.3
姜戈 1.10.8
Python 2.7.10
PostgreSQL 9.6.3
达尔文 17.4.0
这是我的 models.py
页面。
from mezzanine.pages.models import Page
from django.db import models
class MyCustomPage(Page):
a_field = models.CharField(max_length=100)
这是我的 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 代码被缓存,但是模板被缓存了。意思是,如果我 post 到 url,它会调用 do_something_specific(form.cleaned_data)
,那将会发生,它甚至似乎设置了 messages.success
。但是当我下次在页面上执行常规获取请求时,它将使用缓存的模板并且 messages.success
消息将在那里。
为了它的价值,我使用 redis 作为我的缓存后端。我使用的是 memcached,但得到了完全相同的结果。我将缓存用于应用程序的不同部分。另外,我对缓存非常熟悉。我在所有应用程序中都经常使用它。这似乎与夹层缓存有关。
理想情况下,我只想完全禁用夹层缓存,只缓存我明确告诉它要缓存的内容,没有别的。
更新:
@iamkhush 是的,使用 redis-server monitor
我可以验证密钥是否相同。这就是我所做的。清除缓存。运行服务器。在浏览器中获取 URL。缓存不存在,因此它呈现模板并将其设置在缓存中。然后,我填写表格并POST。 page_processor 运行 我的 "if POST" 块中的所有代码。然后它进入缓存并使用存在的密钥进行 GET。因此,它不是重新呈现模板,而是获取缓存中的任何内容,因此成功消息不会进入模板。我刷新了几次,它得到了相同的密钥。所以我清除了缓存,运行 服务器,访问 url,没有缓存所以模板被呈现并且它获取成功消息,然后 html 被设置在缓存中。如果我刷新(重新获取)url,它将从缓存中检索模板。
我认为这是因为中间件 mezzanine.core.middleware.FetchFromCacheMiddleware
和 mezzanine.core.middleware.UpdateCacheMiddleware
的结果
在此处查看 - http://mezzanine.jupo.org/docs/caching-strategy.html#cache-middleware。
您应该删除这些以获得所需的结果
通过以下内容,我创建了一个处理 post 请求的页面。
夹层 4.2.3 姜戈 1.10.8 Python 2.7.10 PostgreSQL 9.6.3 达尔文 17.4.0
这是我的 models.py
页面。
from mezzanine.pages.models import Page
from django.db import models
class MyCustomPage(Page):
a_field = models.CharField(max_length=100)
这是我的 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 代码被缓存,但是模板被缓存了。意思是,如果我 post 到 url,它会调用 do_something_specific(form.cleaned_data)
,那将会发生,它甚至似乎设置了 messages.success
。但是当我下次在页面上执行常规获取请求时,它将使用缓存的模板并且 messages.success
消息将在那里。
为了它的价值,我使用 redis 作为我的缓存后端。我使用的是 memcached,但得到了完全相同的结果。我将缓存用于应用程序的不同部分。另外,我对缓存非常熟悉。我在所有应用程序中都经常使用它。这似乎与夹层缓存有关。
理想情况下,我只想完全禁用夹层缓存,只缓存我明确告诉它要缓存的内容,没有别的。
更新:
@iamkhush 是的,使用 redis-server monitor
我可以验证密钥是否相同。这就是我所做的。清除缓存。运行服务器。在浏览器中获取 URL。缓存不存在,因此它呈现模板并将其设置在缓存中。然后,我填写表格并POST。 page_processor 运行 我的 "if POST" 块中的所有代码。然后它进入缓存并使用存在的密钥进行 GET。因此,它不是重新呈现模板,而是获取缓存中的任何内容,因此成功消息不会进入模板。我刷新了几次,它得到了相同的密钥。所以我清除了缓存,运行 服务器,访问 url,没有缓存所以模板被呈现并且它获取成功消息,然后 html 被设置在缓存中。如果我刷新(重新获取)url,它将从缓存中检索模板。
我认为这是因为中间件 mezzanine.core.middleware.FetchFromCacheMiddleware
和 mezzanine.core.middleware.UpdateCacheMiddleware
在此处查看 - http://mezzanine.jupo.org/docs/caching-strategy.html#cache-middleware。
您应该删除这些以获得所需的结果