Как кэшировать данные запроса на каждый запрос

У меня есть декоратор, который извлекает некоторые данные из БД и изменяет данные контекста ответа. Этот декоратор применяется к нескольким представлениям, проблема в том, что каждый раз, когда выполняется функция декоратора, она снова делает запрос к БД. Я хотел бы кэшировать результат DB только на каждый запрос, при обновлении страницы/новом запросе я хотел бы получать данные снова.

views.py

def set_data():

  def wrapper(request):
   # fetching data from db
   data = get_some_data_from_db()
   response = view(request)
   response.context_data["data"] = data
   return response.render()

 return wrap


@set_data
def view1(request):
  return TemplateResponse(request, "template1.httml", context)

@set_data
def view2(request):
  return TemplateResponse(request, "template2.httml", context)

Я пытался использовать библиотеку django-request-cache, но это не решает проблему.

Есть идеи, как я могу этого добиться?

Вот мое предложение по использованию functools.lru_cache:

from functools import lru_cache

# definition of get_some_data_from_db
@lru_cache(max_size=None)
def get_some_data_from_db():
    # get from db code here...

def view1(request):
    context = {
        # returns cached result
        'data': get_some_data_from_db()  
    }
    # ...
    return TemplateResponse(request, "template1.html", context)


def view2(request):
    context = {
        # returns cached result
        'data': get_some_data_from_db()  
    }
    # ...
    return TemplateResponse(request, "template2.html", context)

def view_that_handles_form_submit(request):
    if request.method == 'POST':
       form = MyFormClass(request.POST)
       if form.is_valid():
           # save input
           form.save()
           # clear the cache 
           get_some_data_from_db.cache_clear()
           context = {
              'form': form,
              'data': get_some_data_from_db(),  # fills cache with new result
           }
    return TemplateResponse(request, "form_template.html", context)
Вернуться на верх