Я реализовал простой класс sitemap, используя django default sitemap app. Поскольку это заняло много времени, я добавил ручное кэширование:
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-объект. Это было больше, чем 1 МБ, поэтому сохранение кэша не удалось:
>7 SERVER_ERROR object too large for cache
Проблема заключается в том, что у django есть автоматизированный способ решения, когда он должен делить файл sitemap на небольшие. Согласно документам (http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
Вам следует создать индексный файл, если один ваших файлов Sitemap содержит более 50 000 URL-адрес. В этом случае Django будет автоматически разбивать карту сайта, и индекс будет отражать это.
Как вы считаете, лучший способ включить кэширование sitemaps? - Взлом в каркасе django sitemaps, чтобы ограничить один размер карты сайта, скажем, 10 000 записей, как лучшая идея. Почему было выбрано 50 000 человек? Совет Google? случайное число? - Или, может быть, есть способ разрешить memcached хранить более крупные файлы? - Или, возможно, сохраненные карты, файлы Sitemap должны быть доступны как статические файлы? Это означало бы, что вместо кэширования с memcached мне пришлось бы вручную сохранять результаты в файловой системе и получать их оттуда в следующий раз, когда запрашивается карта сайта (возможно, ежедневная очистка каталога в задании cron).
Все это кажется очень низким уровнем, и мне интересно, существует ли очевидное решение...