Завершение сеанса django cache.clear() (выход из системы)

Я использую memcached в Django для кэширования всего сайта.

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"

Должен ли я использовать кеш для каждого просмотра?


person Martinez Mariano    schedule 13.06.2017    source источник
comment
Непонятно, что такое кеш всего сайта.   -  person vishes_shell    schedule 13.06.2017
comment
Я кэшировал весь сайт, как описано в документах django, кэшируя запросы на уровне промежуточного программного обеспечения, используя «django.middleware.cache.UpdateCacheMiddleware» и «django.middleware.cache.FetchFromCacheMiddleware». Я добавил ссылку на документы.   -  person Martinez Mariano    schedule 13.06.2017
comment
очистка кеша удалит все сохраненные сеансы. Вы должны либо использовать другой сервер сеанса, либо изменить способ кэширования. Вам действительно нужно кэшировать каждый запрос?   -  person Iain Shelvington    schedule 13.06.2017
comment
Спасибо @IainShelvington, мне действительно нужно кэшировать некоторые вызовы API DRF, но я не смог найти простой способ сделать это, потому что не могу использовать декоратор '@cache_page'. Затем я кэшировал весь сайт, а затем исключил некоторые страницы. Какой другой механизм сеансов я могу использовать?   -  person Martinez Mariano    schedule 13.06.2017


Ответы (1)


from django.contrib.auth import update_session_auth_hash

update_session_auth_hash(request, user)

передать запрос и пользователя вышеуказанным методом при очистке кеша. но по твоему. вы очищаете кеш в сигнале, у которого нет запроса. Итак, если вы обновляете рекламную модель от администратора, то. переопределите метод администратора 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)
person Neeraj Kumar    schedule 13.06.2017
comment
Объект создается из CreateView. Я переопределил метод form_valid и вызвал update_session_auth_hash(request, user) перед сохранением объекта и очисткой кеша, но пользователь по-прежнему выходит из системы. - person Martinez Mariano; 13.06.2017