相关疑难解决方法(0)

仅为经过身份验证的用户进行Django缓存

在Django中,如何创建仅对经过身份验证的用户可见的页面的单个缓存版本(对所有用户都相同)?

建立

我希望缓存的页面仅供经过身份验证的用户使用(他们@login_required在视图中使用).所有经过身份验证的用户都可以使用这些页面(例如,无需vary_on_headers根据唯一用户进行设置).

但是,我不希望这些缓存页面对未经过身份验证的用户可见.

到目前为止我尝试过的

  • 页面级缓存(显示用于登录用户的页面到未登录的用户)
  • vary_on_headers查看使用,但我不需要为每个用户单独缓存页面
  • 我检查了模板片段缓存,但除非我感到困惑,否则这将无法满足我的需求
  • 大量搜索(似乎每个人都想反过来)

谢谢!

示例视图

@login_required
@cache_page(60 * 60)
def index(request):
    '''Display the home page'''
    return render(request, 'index.html')
Run Code Online (Sandbox Code Playgroud)

settings.py(相关部分)

# Add the below for memcache
MIDDLEWARE_CLASSES += (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

# Enable memcache
# https://devcenter.heroku.com/articles/memcache#using_memcache_from_python
CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache'
    }
}
Run Code Online (Sandbox Code Playgroud)

根据@Tisho的回答,我解决了这个问题

  1. decorators.py在我的应用中创建文件
  2. 将以下代码添加到其中
  3. 导入函数 views.py
  4. 将它作为装饰器应用于我想仅为登录用户缓存的视图

decorators.py

from functools import wraps
from django.views.decorators.cache import cache_page
from django.utils.decorators import available_attrs


def cache_on_auth(timeout): …
Run Code Online (Sandbox Code Playgroud)

python django memcached caching heroku

21
推荐指数
1
解决办法
4180
查看次数

如何在 Django 中缓存所有用户的视图

我正在尝试将 AWS ElastiCache 的 Memcached 实例与 Django 项目结合使用。它似乎正在为用户缓存视图,但如果您使用不同的电脑,则在从该电脑(或具有不同浏览器的同一台电脑)调用之前,它不会被缓存。

我不确定我做错了什么。

我里面settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': os.environ.get('CACHE_LOCATION','127.0.0.1:11211'),
    }
}

MIDDLEWARE = [
    'core.middleware.DenyIndexMiddleware',
    'core.middleware.XForwardedForMiddleware',
    'core.middleware.PrimaryHostRedirectMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
    'masquerade.middleware.MasqueradeMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.sites.middleware.CurrentSiteMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.language.LanguageCookieMiddleware',
    'cms.middleware.utils.ApphookReloadMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]
Run Code Online (Sandbox Code Playgroud)

然后我使用缓存了视图cache_page

path('<str:service_type>/<str:location>/', cache_page(60*60)(views.canonical_search), name="canonical-search"),
Run Code Online (Sandbox Code Playgroud)

如何缓存站点以便无论用户如何都缓存页面?

编辑 我注意到它在使用用户登录时从不缓存。

django

5
推荐指数
1
解决办法
1664
查看次数

标签 统计

django ×2

caching ×1

heroku ×1

memcached ×1

python ×1