我试图将缓存添加到我的Django项目中,所以我按照官方文档中的说明(据我了解)添加了缓存中间件,并获得了以下内容:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
但是,这破坏了我的身份验证系统:在其他页面中,我为不同的身份验证级别获取了不同的查询集,但是如果我添加了这些中间件,则向所有用户显示同一页面。 如何在项目中实现缓存,仍然能够为不同的用户提供不同的查询集页面?
这是我来自views.py
的功能:
class ProgettoListView(generic.ListView, LoginRequiredMixin):
model = Progetto
template_name = 'main/list/progetto_list.html'
def get_context_data(self, **kwargs):
context = super(ProgettoListView, self).get_context_data(**kwargs)
context['ore'] = []
for progetto in Progetto.objects.all():
ore_lavoro = Task.objects.filter(progetto=progetto).aggregate(sum_all=Sum('durata')).get('sum_all')
if ore_lavoro is None:
ore_lavoro = datetime.timedelta(0)
context['ore'].append({'nome': progetto.nome, 'ore_lavorate': ore_lavoro,
'percentuale': int(ore_lavoro / progetto.tempo_stimato * 100)})
return context
def get_queryset(self):
if self.request.user.is_amm:
return self.model.objects.all()
return self.model.objects.filter(auts=self.request.user)
is_amm
只是一个布尔字段,auts
是用户列表。
这是urls.py
的那一行:
path('pm/lista/progetti', login_required(views.ProgettoListView.as_view()), name='lista-progetti'),
我遇到的问题是,将is_amm设置为true的用户在访问列表页面时应看到数据库中的所有项目,但这没有发生。例如,如果我与该用户创建一个新项目,尽管他可以通过直接URL访问它,但他将无法在列表视图中看到它。
答案 0 :(得分:0)
听起来您遇到的问题是使用错误的权限缓存了视图。我的猜测是您已经将cache_page
装饰器本身添加到了视图中。这种方法的问题在于,它将缓存对特定URL的任何请求的响应。要允许一个URL具有多个缓存的响应,至少有两个选项。
cache_page
的新装饰器,以便装饰器将检查用户的权限,然后获取相关的缓存响应。cache_page
并通过low-level api手动管理缓存。我个人会选择#2,因为它会更清晰一些,但我认为#1可能会更简洁。