9
votes

Caching Sitemaps à Django

J'ai mis en place une classe de plan de planification simple à l'aide de la demande de plan de table par défaut de Django. Comme il prenait beaucoup de temps pour exécuter, j'ai ajouté la mise en cache manuelle: xxx pré>

Le problème est que MEMCACHED permet uniquement de maximum un objet de 1 MB. Celui-ci était plus grand que 1 MB, alors le stocker dans le cache a échoué: P>

>7 SERVER_ERROR object too large for cache


4 commentaires

Ne faites pas "Résultat! = Aucun", toujours "le résultat n'est pas Aucun"


pourquoi donc? quelle est la différence?


50 000 sont donnés dans le protocole Sitemaps.


Cette limite est définie par Google. Voir la documentation de l'index à l'adresse suivante: Sitemaps.org/protocol.html#index .


4 Réponses :


16
votes

50k n'est pas un paramètre codé dur.

Vous pouvez utiliser la classe django.contrib.sitemaps.genericsItemap à la place: xxx


1 commentaires

C'était utile phénoménalement. Pour une version de travail de cela, voir mon code, ici: Bitbucket.org/mlissner/legal-Current-awareness/src/DC66D2268 BEC / ...



2
votes

En supposant que vous n'ayez pas besoin de toutes ces pages de votre site Plan du site, puis réduisez la limite pour que la taille du fichier bas fonctionnera bien comme décrit dans la réponse précédente.

Si vous voulez un très gros plan de planite et que vous souhaitez utiliser MemCached, vous pouvez diviser le contenu en plusieurs morceaux, rangez-les sous des clés individuelles, puis revenez-les à nouveau sur la sortie. Pour que cela soit plus efficace, Memcached prend en charge la possibilité d'obtenir plusieurs clés en même temps, bien que je ne puisse pas savoir si le client Django prend en charge cette fonctionnalité.

Pour référence, la limite de 1 Mo est une caractéristique de Memcached avec la manière dont il stocke les données: http://code.google.com/p/memcached/wiki/faq#what_is_the_maxim_data_size_you_can_store?_ (1_megabyte)


1 commentaires

Le lien est (efficacement) cassé: "Il y avait une erreur d'obtention de données Wiki"



1
votes

J'ai environ 200 000 pages sur mon site, alors je devais avoir l'index quel que soit quoi. J'ai fini par faire Le Hack , limitant le plan du site à 250 liens, et aussi Mise en œuvre d'un cache basé sur un fichier.

L'algorithme de base est ceci:

  • Essayez de charger le site du site d'un fichier sur disque
  • Si cela échoue, génère le plan du site et
  • Si le site du site contient 250 liens (le numéro défini ci-dessus), enregistrez-le sur le disque, puis renvoyez-le.

    Le résultat final est que la première fois qu'un planite est demandé, s'il est complet, il est généré et enregistré sur le disque. La prochaine fois qu'il est demandé, il est simplement servi de disque. Puisque mon contenu ne change jamais, cela fonctionne très bien. Cependant, si je veux changer de plan de plan de plan, c'est aussi simple que de supprimer le (s) fichier (s) du disque et d'attendre que les chrythers viennent régénérer les choses.

    Le code pour le tout est ici, si vous êtes intéressé: http://bitbucket.org/mlissner/legal-Current-awaReness/src/tip/alert/alertSystem/sitemap.py

    Peut-être que ce sera une bonne solution pour vous aussi.


1 commentaires

Le lien est (efficacement) cassé: "ce lien n'a pas de puissance ici"



3
votes

Vous pouvez également servir des sitemaps également au format GZIP, ce qui les rend beaucoup plus petit. XML convient parfaitement à la compression GZIP. Ce que je fais parfois: créer le (s) fichier (s) du site (s) gzippé (s) dans un cronjob et les rendant aussi souvent que nécessaire. Habituellement, une fois par jour suffira. Le code pour cela peut ressembler à ceci. Assurez-vous simplement d'avoir votre site site.xml.gz servi à partir de votre racine de domaine:

    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()


0 commentaires