Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Question sur la restitution d'une liste dans un template & mise en place d'un cache

#1 02-04-2007 19:44:25

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Question sur la restitution d'une liste dans un template & mise en place d'un cache

Hello,

Pour ma petite application django, je parse des flux rss et à ce titre, j'ai
2 questions :

Q1 : Je joue avec des listes pour gérer les éléments de mon flux rss :

ef person_list(request):
    personlist = Person.objects.all()
    for person in personlist:
        myfeed = feedparser.parse(person.syndication)
        feed_content = []
        i = 0
        while i <= 5:
            feed_title = myfeed.entries[i].title
            feed_link = myfeed.entries[i].link
            feed_content.append([feed_title, feed_link])
            i = i + 1
    return object_list(request, queryset=personlist,
template_name='home/person_list.html', allow_empty = 'True',
extra_context={'feed_content': feed_content, })

Par contre, coté template, je vois que je peux utiliser feed_content.0.0
pour afficher le titre de mon première entrée. Mais j'ai pas trouvé le moyen
de boucler cela de façon dynamique. Une piste à me suggérer ?

Q2 : Pour éviter de parser mon flux à chaque fois, je voudrais mettre un
système de cache en place. C'est quoi la soluce à votre avis ? rappatriez le
fichier en local une fois par jour par ex (via un test de date de dernière
synchro par ex) et le parser ensuite pour le restituer ? A moins qu'on
puisse mettre une page django en cache (sorte de html statique) ?

Merci d'avance,
Nico

Hors ligne

#2 02-04-2007 20:32:57

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le lundi 2 avril 2007 20:44, Nicolas Steinmetz a écrit :
> Hello,
>
> Pour ma petite application django, je parse des flux rss et à ce titre,
> j'ai 2 questions :
>
> Q1 : [snip]
> Q2 : Pour éviter de parser mon flux à chaque fois, je voudrais mettre un
> système de cache en place. C'est quoi la soluce à votre avis ? rappatriez
> le fichier en local une fois par jour par ex (via un test de date de
> dernière synchro par ex) et le parser ensuite pour le restituer ? A moins
> qu'on puisse mettre une page django en cache (sorte de html statique) ?
J'ai fait un lecteur de feed aussi, le modèle d'un objet Feed y contient entre
autre les champs last_loaded (un datetime pas en automatique), etag (un
charfield) et last_modified( un datetime pas automatique).

À chaque fois que je dois _vraiment_ récupérer le feed, je rempli les champs
cités plus haut.

Dans la vue pour lister les items d'un feed, j'utilise l'api bas niveau du
cache, je me fais une clé bien distincte pour chaque feed. Ensuite je
récupère l'objet du Feed si il est pas déja en cache ou que son cache n'est
plus valide, et sinon ben j'utilise le cache.

Je précise que je met en cache uniquement l'objet renvoyé par Feedparser, mais
tu peut très bien y mettre le feed généré en html.

Quand je récupère le feed sur son url, je vérifie qu'il est valide (feedparser
renvoi tout ce qu'il faut en ce qui concerne les erreurs http et la validité
de format du feed).

Pour l'instant je n'utilise pas encore last_modified mais le jour ou j'aurais
un problème d'affluence de lecteurs, je pourrais l'activer.
L'etag pareil, mais au moins déja je le renvoi au serveur que ça peut arranger
si jamais il le gère.

Hors ligne

#3 03-04-2007 08:48:30

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le 02/04/07, David Thenon <david.thenon _AT_ wanadoo.fr> a écrit :

J'ai fait un lecteur de feed aussi, le modèle d'un objet Feed y contient
> entre
> autre les champs last_loaded (un datetime pas en automatique), etag (un
> charfield) et last_modified( un datetime pas automatique).
>
> À chaque fois que je dois _vraiment_ récupérer le feed, je rempli les
> champs
> cités plus haut.
>
> Dans la vue pour lister les items d'un feed, j'utilise l'api bas niveau du
> cache, je me fais une clé bien distincte pour chaque feed. Ensuite je
> récupère l'objet du Feed si il est pas déja en cache ou que son cache
> n'est
> plus valide, et sinon ben j'utilise le cache.


Merci pour ton retour.

Pourquoi ne pas avoir utilisé un cache "de plus haut niveau" ?

Sinon pour les champs du model, j'ai à peu près la même logique, sauf que je
comprends pas à quoi sert le etag et le last_loaded ?

Je pense du coup utiliser le cache fourni par django, mais pour un cache
d'au moins 24h, quelle implémentation vous recommenderiez ? Sur memcached,
la mémoire allouée l'est toujours en globalité ou c'est un maximum que
memcached peut utiliser ?

Nico

<http://www.djangoproject.com/documentation/cache/>

Hors ligne

#4 03-04-2007 09:17:13

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le mardi 3 avril 2007 09:48, Nicolas Steinmetz a écrit :
> Le 02/04/07, David Thenon <david.thenon _AT_ wanadoo.fr> a écrit :
> [snip]
> Merci pour ton retour.
>
> Pourquoi ne pas avoir utilisé un cache "de plus haut niveau" ?
Mes pages contiennent des infos relatives à l'utilisateur qui est loggué donc
je peut pas mettre en cache la page complète (même en gérant le VaryOnHeader
sur la session, j'aurais un cache par user ce que je ne veux pas) et pour
d'obscurs raisons techniques je voulais pas m'amuser à générer le bout de
html du feed à part et le mettre en cache, donc voila.

> Sinon pour les champs du model, j'ai à peu près la même logique, sauf que
> je comprends pas à quoi sert le etag et le last_loaded ?
Etag, c'est une solution équivalente à last_modified, le principe c'est que le
serveur envoi un etag différent à chaque client, quand le client fait une
requête sur le serveur, le serveur lis le Etag renvoyé par le client et en
fonction de ça c'est le serveur (enfin dans un script derrière) qui gère si
il doit t'envoyer une nouvelle version d'un contenu ou pas, etc..

Le truc c'est que en général, last_modified et Etag sont globalement présents
sur la plupart des serveurs qui gère l'un ou l'autre, mais ça arrive que
certains n'en supporte qu'un donc pas soucis de bien faire, j'ai voulu gérer
les deux.

> Je pense du coup utiliser le cache fourni par django, mais pour un cache
> d'au moins 24h, quelle implémentation vous recommenderiez ? Sur memcached,
> la mémoire allouée l'est toujours en globalité ou c'est un maximum que
> memcached peut utiliser ?
Fait toi un truc variable, je pense que 24h de cache ça va te sembler beaucoup
(ben y'a des feeds qui bougent beaucoup).

Aucune idée pour memcached, c'est un gnu tools, j'ose à penser qu'on doit
pouvoir configurer ça.

Hors ligne

#5 03-04-2007 09:50:47

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le 03/04/07, David Thenon <david.thenon _AT_ wanadoo.fr> a écrit :

[snip]
>

Merci pour ces explications :-)

Fait toi un truc variable, je pense que 24h de cache ça va te sembler
> beaucoup
> (ben y'a des feeds qui bougent beaucoup).


En l'occurence, non mais je vais réfléchir à un truc plus variable vu que ça
pourrait être utilisé ailleurs :-P

Aucune idée pour memcached, c'est un gnu tools, j'ose à penser qu'on doit
> pouvoir configurer ça.


Ok, pas de problème.

Merci encore,
Nico

PS : personne pour la question 1 ? ;-)

Hors ligne

#6 03-04-2007 14:53:56

David Larlet
Membre
Inscription : 11-08-2010
Messages : 102

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le 03/04/07, Nicolas Steinmetz<nsteinmetz _AT_ clever-age.com> a écrit :

>
> PS : personne pour la question 1 ? ;-)
>

"for feed_content in feed_contents" ne fonctionne pas ? (oui j'ai
rajouté un s à ta variable initiale wink)

Bonne journée,
David

Hors ligne

#7 03-04-2007 15:01:42

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le 03/04/07, David Larlet <larlet _AT_ gmail.com> a écrit :
>
>
> "for feed_content in feed_contents" ne fonctionne pas ? (oui j'ai
> rajouté un s à ta variable initiale wink)


vu que j'ai des listes dans des listes et qu'elles sont indexées par des
numéros, j'ai comme un gros doute ou alors j'ai 2 boucles for ?

{% for feed_content in feed_contents %}
    {% for content in feed_content %}
        <a href="{{ content.0 }}">{{ content.1 }}</a>
    {% endfor %}
{% endfor %}

ça vous semble juste comme syntaxe ?

Nico

Hors ligne

#8 03-04-2007 15:06:07

David Larlet
Membre
Inscription : 11-08-2010
Messages : 102

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le 03/04/07, Nicolas Steinmetz<nsteinmetz _AT_ gmail.com> a écrit :
> Le 03/04/07, David Larlet <larlet _AT_ gmail.com> a écrit :
> >
> > "for feed_content in feed_contents" ne fonctionne pas ? (oui j'ai
> > rajouté un s à ta variable initiale wink)
>
> vu que j'ai des listes dans des listes et qu'elles sont indexées par des
> numéros, j'ai comme un gros doute ou alors j'ai 2 boucles for ?
>
> {% for feed_content in feed_contents %}
>     {% for content in feed_content %}
>         <a href="{{ content.0 }}">{{ content.1 }}</a>
>     {% endfor %}
> {% endfor %}
>
>  ça vous semble juste comme syntaxe ?

Oui, on ne peut malheureusement pas faire mieux actuellement avec la
syntaxe des templates. Mais c'est en cours de discussion il me semble.

David

Hors ligne

#9 03-04-2007 19:27:50

Nicolas Steinmetz
Membre
Inscription : 11-08-2010
Messages : 96

Re : Question sur la restitution d'une liste dans un template & mise en place d'un cache

Le Mardi 3 Avril 2007, David Larlet a écrit :
> Le 03/04/07, Nicolas Steinmetz<nsteinmetz _AT_ gmail.com> a écrit :
> > Le 03/04/07, David Larlet <larlet _AT_ gmail.com> a écrit :
> > > "for feed_content in feed_contents" ne fonctionne pas ? (oui j'ai
> > > rajouté un s à ta variable initiale wink)
> >
> > vu que j'ai des listes dans des listes et qu'elles sont indexées par des
> > numéros, j'ai comme un gros doute ou alors j'ai 2 boucles for ?
> >
> > {% for feed_content in feed_contents %}
> >     {% for content in feed_content %}
> >         <a href="{{ content.0 }}">{{ content.1 }}</a>
> >     {% endfor %}
> > {% endfor %}
> >
> >  ça vous semble juste comme syntaxe ?
>
> Oui, on ne peut malheureusement pas faire mieux actuellement avec la
> syntaxe des templates. Mais c'est en cours de discussion il me semble.

La syntaxe, ci-dessus est fausse, la bonne en faite est (pour une liste de
listes) :

                {% for feed_content in feed_contents %}
                    {% comment %} feed_content is a list with numeral index. "0" is URL
and "1" is title {% endcomment %}
                    <li><a href="{{ feed_content.0 }}">{{ feed_content.1 }}</a></li>
                {% endfor %}

Si on va plus loin, on ne manipule plus les éléments de la liste mais les
caractères de chaque entrée :-P

Hors ligne

  • Accueil
  • » Django-fr
  • » Question sur la restitution d'une liste dans un template & mise en place d'un cache

Pied de page des forums