Как мы можем получить обновленные данные, обновив кэш с помощью cache_page в DRF с тем же маршрутом?

Веб-сайт похож по функциональности на Twitter и мы используем механизм кэширования Django для фида, но когда пользователь создал свой пост, он не может найти свой пост в течение следующих 10 минут из-за кэширования, и мы хотим показать последние результаты пользователю, поэтому, как мы можем показать последние данные пользователю после создания его поста, используя тот же маршрут

Вот код urls.py

from django.views.decorators.cache import cache_page
from . import views
CACHE_TIME=60*10
urlpatterns = [
    path('', cache_page(CACHE_TIME)(views.PostListAPIView.as_view()), name="post-list")
]

если мы вызовем API --> http://127.0.0.1:8000/v1/posts/, то данные будут храниться в кэше в течение следующих 10 минут, но я хочу обновить данные после определенного события, поэтому, как мы можем получить обновленные данные до истечения 10 минут

также, Мы нашли решение для этого, если мы передаем http://127.0.0.1:8000/v1/posts/?{username}=true, то мы можем получить последние данные для пользователя , но есть ли другой лучший подход или возможность показать последние данные? Если да, то пожалуйста, перечислите метод и некоторые детали о нем

Вы можете использовать

select_for_update , который был представлен в Django 1.4 и выполняет блокировку базы данных на уровне строк. Все объекты в queryset будут "заблокированы" до конца блока транзакции, что означает, что другие транзакции не смогут изменить или получить блокировки на них.

Это лучший подход для вас:

  1. Использование сигнала для определения добавления сообщения
  2. В документации по кэшу django говорится, что cache.delete('key') должно быть достаточно. Так что просто нужно использовать его, и вызвать функцию для разогрева кэша, если это необходимо.
  3. .

Код примера

@receiver(post_save, sender=Post)
def invalidate_post_list_cache(sender, instance, **kwargs):
    """
    This signal helps invalidate post list cache and warm-up cache
    """
    cache.delete('key')
    call_function_to_warm_up_cache()
<
Вернуться на верх