Кэш-представление 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):
    ...

Ответ 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 для этого.