小编典典

在Django中缓存站点地图

python

我使用Django的默认站点地图应用程序实现了一个简单的站点地图类。由于执行时间很长,因此我添加了手动缓存:

class ShortReviewsSitemap(Sitemap):
    changefreq = "hourly"
    priority = 0.7

    def items(self):
        # Try to retrieve from cache
        result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews")
        if result!=None:
            return result

        result = ShortReview.objects.all().order_by("-created_at")

        # Store in cache
        set_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews", result)

        return result

    def lastmod(self, obj):
        return obj.updated_at

问题在于Memcached最多只允许一个1 MB的对象。这个大于1
MB,因此将其存储到缓存失败:

>7 SERVER_ERROR object too large for cache

问题在于Django有一种自动的方式来决定何时将站点地图文件分成较小的文件。根据文档

如果您的一个站点地图具有超过50,000个URL,则应创建一个索引文件。在这种情况下,Django将自动对站点地图进行分页,索引将对此进行分页。

您认为启用缓存站点地图的最佳方法是什么?

  • 侵入Django sitemaps框架以将单个Sitemap的大小限制为10,000条记录似乎是最好的主意。为什么首先选择50,000?Google建议?随机数?
  • 也许有一种方法可以让Memcached存储更大的文件?
  • 或者,也许一旦保存,站点地图应该以静态文件形式提供?这意味着,除了使用Memcached进行缓存外,我还必须将结果手动存储在文件系统中,并在下次请求站点地图时从那里检索它们(也许每天在cron作业中清理目录)。

所有这些似乎水平都很低,我想知道是否存在明显的解决方案…


阅读 251

收藏
2021-01-20

共1个答案

小编典典

50k不是硬编码参数。

您可以改用 django.contrib.sitemaps.GenericSitemap 类:

class LimitGenericSitemap(GenericSitemap):
    limit = 2000
2021-01-20