2010-01-17 68 views
8

我使用django的默认站点地图应用程序实现了一个简单的站点地图类。由于需要很长时间来执行,我添加了手动缓存:在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的有决定​​何时应该划分网站地图文件到smalled的传输的自动方法。根据该文档(http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):

您应该创建一个索引文件,如果一个 您的Sitemaps有超过50,000 网址。在这种情况下,Django会自动将 分页, 并且索引将反映这一点。

您认为启用缓存站点地图的最佳方式是什么? - 黑客进入Django站点地图框架来限制单个站点地图大小,比方说,10,000条记录似乎是最好的主意。为什么首先选择了50,000个? Google的建议?随机数? - 或者也许有办法允许memcached存储更大的文件? - 或者可能已保存,网站地图应作为静态文件提供?这意味着,不要使用memcached缓存,我必须手动将结果存储在文件系统中,并在下次请求站点地图时从中检索结果(可能每天在cron作业中清理目录)。

所有这些似乎非常低的水平,我想知道,如果一个显而易见的解决方案存在...

+2

不要做“结果!=无”,总是做“结果不是无” – stefanw 2010-01-17 19:13:39

+1

这是为什么?有什么不同? – michuk 2010-01-28 23:33:27

+0

50,000是在Sitemaps协议中给出的。 – webjunkie 2010-08-15 10:12:55

回答

13

50K它不是一个铁杆的参数。 :)

你可以使用这个类,而不是django.contrib.sitemaps.GenericSitemap

class LimitGenericSitemap(GenericSitemap): 
    limit = 2000 
+0

这是非常有用的。对于这个工作版本,请参阅我的代码,在这里:http://bitbucket.org/mlissner/legal-current-awareness/src/dc66d2268bec/alert/alertSystem/sitemap.py – mlissner 2010-05-01 07:06:19

2

假设你不需要在你的网站地图所有这些网页然后还原限制得到减少文件大小将工作正如前面的回答所述。

如果你想有一个非常大的网站地图,并想使用memcached的,你可以达到分裂内容分成多个块,将它们存储各个键下,然后把它们重新结合在一起输出。为了使这更有效的Memcached的支持,同时得到多个键的能力,虽然我不知道Django的客户端是否支持此功能呢。

,以供参考1MB限制是memcached的功能,用它做如何存储数据:http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_(1_megabyte)

1

我有我的网站上约200,000页,所以我必须有索引不管。我结束了做上述黑客,限制了网站地图250点联系,并实现基于文件的缓存。

的基本算法是这样的:

  • 尝试从文件加载地图上盘
  • 如果失败,生成网站地图,并
  • 如果站点地图包含250个链接(数设置在上面),将其保存到磁盘然后返回。

最终的结果是,第一次请求一个站点地图,如果它完成,它会生成并保存到磁盘。下一次请求时,它只是从磁盘提供。由于我的内容不会改变,所以这很有效。但是,如果我想更改站点地图,就像从磁盘上删除文件一样简单,并等待搜寻器重新生成。

整个事情的代码是在这里,如果你有兴趣:http://bitbucket.org/mlissner/legal-current-awareness/src/tip/alert/alertSystem/sitemap.py

也许这将是一个很好的解决方案,你太。

1

你也可以以gzip格式提供站点地图,这使得它们更小。 XML非常适合gzip压缩。我有时候会这样做:在cronjob中创建gzip站点地图文件,并根据需要经常渲染它们。通常,每天一次就足够了。这个代码可能看起来像这样。只需确保从您的域根目录中提供您的sitemap.xml.gz:

from django.contrib.sitemaps import GenericSitemap 
    from django.contrib.sitemaps.views import sitemap 
    from django.utils.encoding import smart_str 
    import gzip 
    sitemaps = { 
     'page': GenericSitemap({'queryset': MyModel.objects.all().order_by('-created'), 'date_field': 'created'}), 
    } 
    f = gzip.open(settings.STATIC_ROOT+'/sitemap.xml.gz', 'wb') 
    f.write(smart_str(sitemap(request, sitemaps=sitemaps).render().content)) 
    f.close() 

这应该让您开始。