Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

article.md 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. title: Ajout des flux RSS, du sitemap et des commentaires avec Django
  2. slug: ajout-des-flux-rss-du-sitemap-et-des-commentaires-avec-django
  3. date: 2007-06-23 19:21:39
  4. type: post
  5. vignette: images/logos/biologeek.png
  6. contextual_title1: Biologeek (enfin) propulsé par Django
  7. contextual_url1: 20080423-biologeek-enfin-propulse-par-django
  8. contextual_title2: De Dotclear à Django : migration des données et redirections
  9. contextual_url2: 20070523-de-dotclear-a-django-migration-des-donnees-et-redirections
  10. contextual_title3: Vues génériques, héritage et templatetags : développez rapidement avec Django
  11. contextual_url3: 20070424-vues-generiques-heritage-et-templatetags-developpez-rapidement-avec-django
  12. <p>Suite de la <a href="https://larlet.fr/david/biologeek/archives/20070224-objectifs-et-motivations-de-la-refonte-de-ce-blog/">refonte de ce blog</a> qui commence vraiment à trainer en longueur... il faut dire que ça me prend souvent plus de temps de décrire ce qui est fait que de le coder&nbsp;! Du coup c'est probablement le dernier billet à ce sujet. De toute façon c'est presque terminé, il ne me reste plus qu'à mettre quelques surprises et à adapter le thème, voire peut-être à tenter un <a href="http://forum.alsacreations.com/concours/cssr2007/">Cascading Style Summer Refresh 2007</a> mais j'en doute car je vais manquer de temps ces prochains mois.</p>
  13. <h2>Ajout des flux RSS et Atom</h2>
  14. <p>J'essaye toujours d'<strong>utiliser au maximum les fonctionnalités offertes par Django</strong> qui suit la philosophie Python «&nbsp;batteries incluses ». Dans le cas des flux je voulais quelque chose de très spécifique donc il a fallu mettre un peu les mains dans le cambouis mais c'est ce qui fait le charme d'un framework&nbsp;: <strong>on peut tout contrôler</strong>&nbsp;!</p>
  15. <p>On commence par le cahier des charges, le but était d'avoir des URL du type <strong>/abonnement/{ rss, atom }/{journal, bistrot, tag, liste de tags }/</strong> afin de laisser la possibilité d'utiliser soit RSS, soit Atom tout en ayant des URL relativement courtes et compréhensibles. Au niveau du fichier des URL on retrouve donc&nbsp;:</p>
  16. <pre>from biologeek.feeds import RSSFeed, AtomFeed
  17. urlpatterns += patterns('django.contrib.syndication.views',
  18. (r'^abonnement/(?P&lt;url&gt;.*)/$', 'feed',
  19. {'feed_dict': { 'rss': RSSFeed, 'atom': AtomFeed }}
  20. ),
  21. )</pre>
  22. <p>Les clés du dictionnaire <strong>feed_dict</strong> vont être passées en paramètre de la fonction feed pour se retrouver dans l'URL donc jusqu'ici on a <strong>/abonnement/{ rss, atom }/</strong>. C'est ensuite au niveau des classes RSSFeed et AtomFeed qu'il faut décider du contenu qui va être proposé&nbsp;:</p>
  23. <pre>from django.contrib.syndication.feeds import Feed
  24. from biologeek.journal.models import Post
  25. class RSSFeed(Feed):
  26. description = u'Dernières mises à jour du site de David Larlet : biologeek.com relatives aux %s'
  27. author_name = 'David Larlet'
  28. author_link = 'http://larlet.fr/'
  29. copyright = 'Copyright (c) 2004-2007, David Larlet, Licence Art Libre'
  30. def get_object(self, bits):
  31. if len(bits) == 1:
  32. bit = bits[0]
  33. if bit == 'journal':
  34. self.title = 'Flux RSS des billets du journal du site biologeek.com'
  35. self.link = '/journal/'
  36. self.description = self.description % u'billets du journal'
  37. return Post.published.all()[:25]
  38. [...]
  39. else:
  40. raise ObjectDoesNotExist
  41. def items(self, obj):
  42. return obj</pre>
  43. <p>Je ne mets pas tout mais vous aurez compris le principe (si non <a href="http://code.google.com/p/biologeek/">vous pouvez récupérer les sources sur le dépôt</a>). En fonction de la valeur passée en URL, un contenu approprié est proposé. C'est pas vraiment élégant et cela tient au cahier des charges un peu spécial que je m'étais fixé, sinon c'est beaucoup plus simple comme vous pouvez le voir <a href="http://www.djangoproject.com/documentation/syndication_feeds/">dans la documentation</a>.</p>
  44. <p>Lorsque l'on veut passer au flux Atom, il suffit d'hériter de la classe utilisée pour le RSS&nbsp;:</p>
  45. <pre>from django.utils.feedgenerator import Atom1Feed
  46. class AtomFeed(RSSFeed):
  47. feed_type = Atom1Feed
  48. subtitle = RSSFeed.description</pre>
  49. <h2>Ajout d'un sitemap</h2>
  50. <p><strong>Un <a href="http://www.sitemaps.org/fr/">sitemap</a> est une aide pour les moteurs de recherche</strong>. C'est un fichier xml permettant d'indiquer l'importance relative des pages du site et leur fréquence de mise à jour. Il est généralement placé sur <strong>/sitemap.xml</strong> et il est nécessaire de <a href="http://www.google.com/webmasters/sitemaps/?hl=fr">le déclarer pour qu'il soit indexé</a>. On va ici se servir du <a href="http://www.djangoproject.com/documentation/sitemaps/">module sitemap de Django</a>, on rajoute donc l'URL&nbsp;:</p>
  51. <pre>from biologeek.sitemaps import sitemaps
  52. urlpatterns += patterns('django.contrib.sitemaps.views',
  53. (r'^sitemap.xml$', 'sitemap', {'sitemaps': sitemaps})
  54. )</pre>
  55. <p>La gestion des sitemaps peut se faire de manière générique, ce qui est très pratique pour les modèles que j'ai choisi&nbsp;:</p>
  56. <pre>from django.contrib.sitemaps import GenericSitemap
  57. from biologeek.journal.models import Post
  58. sitemaps = {
  59. 'journal_bestof': GenericSitemap(
  60. {
  61. 'queryset': Post.published.filter(is_bestof=True),
  62. 'date_field': 'publication_date'
  63. },
  64. priority=0.6
  65. ),
  66. 'journal': GenericSitemap(
  67. {
  68. 'queryset': Post.published.exclude(is_bestof=False),
  69. 'date_field': 'publication_date'
  70. },
  71. priority=0.4
  72. ),
  73. [...]
  74. }</pre>
  75. <p>Par contre j'ai pas mal cherché pour arriver à rajouter les liens qui ne sont pas inhérents à des modèles comme l'accueil ou les pages d'agrégation de ressources. J'ai finalement créé une classe dédiée à ça&nbsp;:</p>
  76. <pre>from django.contrib.sitemaps import Sitemap
  77. class BaseSitemap(Sitemap):
  78. priority = 0.8
  79. def items(self):
  80. return ['/', '/journal/', '/bistrot/', '/archives/', '/abonnement/', '/contact/']
  81. def location(self, obj):
  82. return obj</pre>
  83. <p>qu'il suffit ensuite d'ajouter au dictionnaire précédent. Comme vous pouvez le remarquer, je ne spécifie pas la fréquence de mise à jour car les pages de ressources sont susceptibles d'évoluer au cours du temps grâce aux commentaires et celles d'agrégations sont mises à jour de façon non régulière compte tenu de mon rythme de publication. <strong>Dans le doute, il vaut mieux s'abstenir Google saura mieux algorithmer tout ça que vous.</strong></p>
  84. <h2>Ajout des commentaires</h2>
  85. <p>Comme je le disais plus haut j'aime bien utiliser les modules déjà inclus dans Django. Pour les commentaires, <strong>je vais peut-être faire une petite exception pour deux raisons</strong>&nbsp;:</p>
  86. <ul>
  87. <li>même s'il est très puissant (peut-être trop d'ailleurs pour mes besoins&nbsp;: karma, etc), il est <strong>très peu extensible</strong> en l'état et doit être réécrit pour ça&nbsp;;</li>
  88. <li>il utilise les <strong>anciens formulaires</strong> et je ne trouve pas intéressant de continuer à les utiliser aujourd'hui.</li>
  89. </ul>
  90. <p>Je n'ai pas encore décidé de ce que j'allais faire. Il me reste aussi à intégrer l'<a href="https://larlet.fr/david/biologeek/archives/20070104-comment-utiliser-openid-la-solution-d-identification-tant-attendue/">identification via OpenID</a> pour vous rendre la vie plus facile :-).</p>
  91. <p>Prochaine étape... euh... <strong>la mise en ligne</strong>&nbsp;! J'ai pas mal galéré pour <a href="http://www.django-fr.org/">Django-fr</a> donc ça devrait aller beaucoup plus vite.</p>