我使用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
问题是memcache只允许最大1MB的对象.这个比1MB大,所以存入缓存失败:
>7 SERVER_ERROR object too large for cache
问题是django有一种自动的方法来决定何时应该将站点地图文件划分为较小的站点地图文件.根据文档(http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
如果您的某个站点地图的网址超过50,000,则应创建索引文件.在这种情况下,Django将自动对站点地图进行分页,索引将反映出来.
您认为启用缓存站点地图的最佳方式是什么? - 攻击django sitemaps框架以限制单个站点地图大小,比方说,10,000个记录似乎是最好的主意.为什么首先选择了50,000个?谷歌的建议?随机数? - 或许有一种方法可以让memcached存储更大的文件? - 或者也许保存了onces,站点地图应该作为静态文件提供?这意味着不是使用memcached进行缓存,而是必须手动将结果存储在文件系统中,并在下次请求站点地图时从那里检索它们(可能每天在cron作业中清理目录).
所有这些似乎都很低级,我想知道是否存在明显的解决方案......
50k它不是一个核心参数.:)
您可以使用此类代替django.contrib.sitemaps.GenericSitemap
class LimitGenericSitemap(GenericSitemap): limit = 2000