Implementé una clase de sitemap simple usando la aplicación de mapa de sitio predeterminada de django. Ya que estaba tomando mucho tiempo para ejecutar, añadí el almacenamiento en caché Manual:Almacenamiento de sitemaps en 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
El problema es que Memcache permite único objeto máximo de 1 MB. Éste era más grande que 1 MB, por lo que el almacenamiento en caché falló:
>7 SERVER_ERROR object too large for cache
El problema es que Django tiene una forma automatizada de decidir cuándo se debe dividir el archivo de mapa del sitio en smalled queridos. De acuerdo con la documentación (http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
Debe crear un archivo de índice si uno de sus mapas de sitio cuenta con más de 50.000 URL. En este caso, Django va a paginar automáticamente el mapa del sitio, y el índice reflejará eso.
¿Cuál crees que sería la mejor manera de habilitar el almacenamiento en caché de sitemaps? - Hackear el marco de sitemaps de django para restringir un solo tamaño de mapa de sitio a, digamos, 10,000 registros parece ser la mejor idea. ¿Por qué se eligieron 50,000 en primer lugar? Consejo de Google? ¿número aleatorio? - ¿O tal vez hay una forma de permitir que la memoria de memcached almacene archivos más grandes? - ¿O tal vez se guardaron onces, los sitemaps deberían estar disponibles como archivos estáticos? Esto significaría que, en lugar de almacenar en caché con memcached, tendría que almacenar manualmente los resultados en el sistema de archivos y recuperarlos la próxima vez cuando se solicite el mapa del sitio (quizás limpiando el directorio diariamente en un trabajo cron).
Todos aquellos parecen muy bajo nivel y me pregunto si existe una solución obvia ...
Do not do "result! = None", always do "result is not None" – stefanw
¿por qué es eso? ¿cual es la diferencia? – michuk
50,000 se da en el protocolo Sitemaps. – webjunkie