Кэш-представление django с параметрами URL
Недавно я реализовал превосходную структуру кэша Django. Однако из того, что я понимаю, Django не кэширует представление, которое передается параметрам в запросе get.
У меня есть представление Ajax, которое передается с параметрами, которые я хотел бы кэшировать в течение X секунд, что было бы простым способом сделать это?
В коде psuedo у меня есть URL-адрес:
http://mysites/ajaxthing/?user=foo&items=10
Я хотел бы кэшировать любой этот URL-адрес, если он имеет одинаковые параметры get.
В настоящее время я использую декораторы кеша:
myview(stuff)
myview = cache_page(myview, 60 * 3)
Я читал о django менял заголовки, но это немного пошло мне на голову, и я даже не уверен, что это правильное решение
Ответы
Ответ 1
Правильно, изменять заголовки не является правильным решением, оно используется, когда вы хотите кэшировать на основе заголовков запросов клиентов, таких как пользовательский агент и т.д.
Вам нужно будет использовать низкоуровневый API или фрагмент шаблона кэширование. Это действительно зависит от ваших взглядов.
С низкоуровневым API он выглядит примерно так:
from django.core.cache import cache
def get_user(request):
user_id = request.GET.get("user_id")
user = cache.get("user_id_%s"%user_id)
if user is None:
user = User.objects.get(pk=user_id)
cache.set("user_id_%s"%user_id, user, 10*60) # 10 minutes
...
..
.
Ответ 2
Да, вы можете использовать django-view-cache-utils, вот код для вашего случая:
from view_cache_utils import cache_page_with_prefix
from django.utils.hashcompat import md5_constructor
...
@cache_page_with_prefix(60*15, lambda request: md5_constructor(request.get_full_path()).hexdigest())
def my_view(request):
...
Ответ 3
Это уже не проблема в Django 1.3+.
См.: https://docs.djangoproject.com/en/dev/topics/cache/#using-vary-headers
Ответ 4
Похоже, вам больше не нужно делать что-то более сложное, чем размещать @cache_page ([длительность времени]) над вашей функцией просмотра, которую вы пытаетесь кэшировать, независимо от того, есть ли у вас параметры в URL-адресе.
Например, если у вас есть URL-адрес:
http://example.com/user/some_user_id
Ваша функция просмотра в views.py будет выглядеть примерно так:
from django.views.decorators.cache import cache_page
...
@cache_page(60 * 10)
def get_user_detail(request, user_id=None):
...
return render(...)
Ответ 5
немного поздно, но вы можете использовать django-view-cache-utils для этого.