我使用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有一种自动的方式来决定何时应将站点地图文件分成较小的文件。根据the documentation:

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

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

    最佳答案

    50k不是硬编码参数。
    您可以改用django.contrib.sitemaps.GenericSitemap类:

    class LimitGenericSitemap(GenericSitemap):
        limit = 2000
    

    关于python - 在Django中缓存站点地图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2079786/

    10-10 09:39