Правильный способ предоставления кэш-бэкенда в 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.