2010-01-17 72 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() 

這應該讓您開始。