Правильный способ предоставления кэш-бэкенда в Django

Я следую этой части документации Django, пытаясь добавить кэш в генерируемые карты сайта. Документация предоставляет следующий пример кода:

from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path('sitemap.xml',
         cache_page(86400)(sitemaps_views.index),
         {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
    path('sitemap-<section>.xml',
         cache_page(86400)(sitemaps_views.sitemap),
         {'sitemaps': sitemaps}, name='sitemaps'),
]

Он работает как ожидалось и кэширует результат в моем кэше по умолчанию (redis). Но поскольку у меня очень большая карта сайта, я хотел бы, чтобы кэш хранился в файловом кэше, а не в памяти. Мой django settings.py включает необходимые настройки:

CACHES = {
    # Redis cache
    "default": { ... },
    # File cache
    "file": { ... },
}

Однако когда я пытаюсь указать правильные аргументы для cache_page декоратора:

urlpatterns = [
    path('sitemap.xml',
         cache_page(86400)(sitemaps_views.index)(cache="file"), # <--- !!!
         {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
]

Я получаю ошибку: TypeError: _wrapped_view() missing 1 required positional argument: 'request'

Какой правильный способ предоставления кэш-бэкенда в таком случае?

Вы перепутали вызовы функций. Вместо

urlpatterns = [
    path('sitemap.xml',
         cache_page(86400)(sitemaps_views.index)(cache="file"), # <--- !!!
         {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
]

должно быть

urlpatterns = [
    path('sitemap.xml',
         cache_page(86400, cache="file")(sitemaps_views.index), # <--- !!!
         {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
]

Аргумент cache должен быть в вызове cache_page.

Вернуться на верх