【问题标题】:Correct way to provide cache backend in Django在 Django 中提供缓存后端的正确方法
【发布时间】:2022-01-25 14:55:58
【问题描述】:

我正在关注 Django 文档的 this part,试图将缓存添加到生成的站点地图。文档提供以下示例代码:

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'

在这种情况下,提供缓存后端的正确方法是什么?

【问题讨论】:

标签: python django


【解决方案1】:

您混淆了函数调用。而不是

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 调用中。

【讨论】:

  • 谢谢@jmangold,它成功了。 (我讨厌装饰器语法:))
猜你喜欢
  • 1970-01-01
  • 2016-12-27
  • 2017-06-03
  • 1970-01-01
  • 2013-11-28
  • 2019-07-31
  • 2011-11-15
  • 2021-01-27
  • 2019-09-27
相关资源
最近更新 更多