【问题标题】:django cache.clear() ending session (logout)django cache.clear() 结束会话(注销)
【发布时间】:2017-11-15 04:43:28
【问题描述】:

我在 Django 中使用 memcached 来缓存整个站点。

https://docs.djangoproject.com/en/1.11/topics/cache/#the-per-site-cache

我在保存后信号处理程序方法中添加了一些代码,以便在模型中创建或更新某些对象时清除缓存。

from proximity.models import Advert

# Cache
from django.core.cache import cache

@receiver(post_save, sender=Advert)
def save_advert(sender, instance, **kwargs):
    # Clear cache
    cache.clear()

不幸的是,现在在创建新对象后,用户已注销。

我认为原因可能是我正在缓存会话。

# Cache config
CACHE_MIDDLEWARE_SECONDS = 31449600 #(approximately 1 year, in seconds)
CACHE_MIDDLEWARE_KEY_PREFIX = COREAPP
CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
        "LOCATION": "127.0.0.1:11211",
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"

我应该使用按视图缓存吗?

【问题讨论】:

  • 不清楚“缓存整个站点”是什么。
  • 我已经按照 django 文档中的描述缓存了整个站点,使用 'django.middleware.cache.UpdateCacheMiddleware' 和 'django.middleware.cache.FetchFromCacheMiddleware' 在中间件级别缓存请求。我添加了一个文档链接。
  • 清除缓存将清除所有已保存的会话。您应该使用不同的会话后端或更改缓存方式。你真的需要缓存每一个请求吗?
  • 感谢@IainShelvington,我真正需要的是缓存一些 DRF API 调用,但我找不到一个简单的方法来做到这一点,因为我不能使用装饰器'@cache_page'。然后我缓存了整个网站,然后排除了一些页面。我可以使用哪些其他会话引擎?

标签: python django django-sessions django-cache


【解决方案1】:
from django.contrib.auth import update_session_auth_hash

update_session_auth_hash(request, user)

在清除缓存时通过上述方法传递请求和用户。但根据你的方式。您正在清除没有请求的信号中的缓存。因此,如果您要从管理员更新广告模型,那么。覆盖 admin save_model() 方法保存,在这里你可以获取用户和请求,所以在清除缓存后调用上面的 update_session_auth_hash。它不会注销用户。如果您从自己的视图更新数据,则使用相同的方法来调用继续用户登录的方法。

编辑

def form_valid(self, form)
    user = self.request.user
    form.save()  # When you save then signal will call that clear your cache
    update_session_auth_hash(self.request, user)

【讨论】:

  • 对象正在从 CreateVIew 创建。在保存对象和清除缓存之前,我已经覆盖了方法 form_valid 并调用了 update_session_auth_hash(request, user),但用户仍然被注销。
猜你喜欢
  • 2018-08-17
  • 2015-03-30
  • 1970-01-01
  • 2020-11-20
  • 2018-06-12
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多