Как кэшировать данные запроса на каждый запрос
У меня есть декоратор, который извлекает некоторые данные из БД и изменяет данные контекста ответа. Этот декоратор применяется к нескольким представлениям, проблема в том, что каждый раз, когда выполняется функция декоратора, она снова делает запрос к БД. Я хотел бы кэшировать результат 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)