Python django cache.clear()结束会话(注销)
我在Django中使用memcached来缓存整个站点 我在保存后信号处理程序方法中添加了一些代码,以便在模型中创建或更新某些对象时清除缓存Python django cache.clear()结束会话(注销),python,django,django-sessions,django-cache,Python,Django,Django Sessions,Django Cache,我在Django中使用memcached来缓存整个站点 我在保存后信号处理程序方法中添加了一些代码,以便在模型中创建或更新某些对象时清除缓存 from proximity.models import Advert # Cache from django.core.cache import cache @receiver(post_save, sender=Advert) def save_advert(sender, instance, **kwargs): # Clear cac
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"
我应该使用每视图缓存吗
from django.contrib.auth import update_session_auth_hash
update_session_auth_hash(request, user)
清除缓存时,按上述方法传递请求和用户。但是按照你的方式。您正在清除没有请求的信号中的缓存。所以,如果你是更新广告模型从管理员然后。重写adminsave\u model()
方法进行保存,在这里您可以获得用户和请求,因此在清除缓存后调用上面的update\u session\u auth\u 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)
“缓存整个站点”是什么还不清楚。我已经按照django文档中的描述缓存了整个站点,使用“django.middleware.cache.UpdateChemiddleware”和“django.middleware.cache.fetchFromCacheMidleware”在中间件级别更改请求。我已添加到文档的链接。清除缓存将清除所有保存的会话。您应该使用不同的会话后端或更改缓存的方式。你真的需要缓存每一个请求吗?谢谢@IainShelvington,我真正需要的是缓存一些DRF API调用,但我找不到一个简单的方法来实现,因为我不能使用decorator'@cache_page'。然后我缓存了整个站点,然后排除了一些页面。我可以使用哪些其他会话引擎?正在从CreateVIew创建对象。在保存对象和清除缓存之前,我已经重写了方法form\u valid并调用了update\u session\u auth\u hash(请求,用户),但用户仍然被注销。