Django-fr

Forum

#1 15-08-2012 19:28:34

philippe2
Membre
Inscription : 15-08-2012
Messages : 2

Comportement aléatoire dans les views.py

Bonjour,

Je suis en train d'apprendre django, et je viens de mettre mon projet en production avec Apache (mod_wsgi) sur Linux debian Squeeze.
Basiquement, il s'agit d'un blog avec des messages, la page principale devant afficher le dernier post publié.

Voici le code dans views.py:

def index(request):
       messages = get_list_or_404(Message.objects.order_by('publication_date'))
       last = messages[-1]
       return render_to_response('posts/index.html', {
          'last_message' : last,                                                       
          'posts_list'   : messages,
       })

Voici le code dans index.html

{% if last_message %}
<article>
<h1><a href="/posts/{{ last_message.id }}">{{ last_message.title }}</a></h1>
<p class="meta_infos">Published on {{ last_message.publication_date }}</p>
<p>{{ last_message.text }}</p>
</article>
{% else %}
<p>No post available</p>
{% endif %}

Normalement, le dernier post s'affiche.
Cependant, lorsque j'appuie sur F5, encore, et encore (pas comme un bourrin, mais toutes les secondes, par exemple) des fois, le premier message s'affiche au lieu du dernier.

J'ai essayé ce code pour view.py:

def index(request):
   messages = get_list_or_404(Message.objects.order_by('publication_date'))
   try:
      last = Message.objects.order_by('publication_date')[0]
   except IndexError:
      raise Http404
   return render_to_response('posts/index.html', {
      'last_message' : last,
      'posts_list'   : messages,
   })

avec le même résultat aléatoire: Des fois le dernier, des fois le premier post s'affiche.

Je précise que lorsque je teste avec le serveur de développement de django, je n'ai pas ce comportement. Donc le problème viendrait d'apache? Rien de bizarre dans les logs pourtant.

Merci pour m'aider à comprendre ce qui cloche ici hmm

Hors ligne

#2 15-08-2012 20:33:51

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

Re : Comportement aléatoire dans les views.py

Salut,

Bon à priori y'a pas de raisons, ce que tu fais sembles assez simple et
propre, l'orm de django a pas de bug à ma connaissance qui lui ferait perdre
le sens que tu lui imposes pour tes résultats, ton utilisation du slicing
semble correct.

Ca pourrait être un problème de cache dans certains cas et si tu l'utilises,
ou un problème de BDD.

Tu n'utilises rien de particulier autour de ta vue genre un Etag ? Ton vhost
dans apache ne fait rien de particulier avec un module Apache ?

Note que quand tu fais des modifs sur ton code ou un update de ton appli
depuis un dépôt, il faut bien sur reloader Apache sinon tu a des "miettes"
d'instances qui restent et peuvent amener à des comportements aléatoires
pendant quelques temps. (je le précise parce que les gens venant de PHP par
exemple, n'ont pas ce réflexe).

Hors ligne

#3 15-08-2012 20:44:01

Rémy HUBSCHER
Membre
Inscription : 11-08-2010
Messages : 161

Re : Comportement aléatoire dans les views.py

Bonsoir,

Ce comportement est bien évidement bizarre.

Ce que je te propose c'est de remplacer ta view par :

    Voici le code dans views.py:

      def index(request):
            messages = Message.objects.order_by('-publication_date')
            if not messages:
                raise Http404
            last = messages[0]
            return render_to_response('posts/index.html', {
               'last_message' : last,
               'posts_list'   : messages,
            })

    Voici le code dans index.html

      <article>
      <h1><a href="/posts/{{ last_message.id }}">{{ last_message.title
    }}</a></h1>
      <p class="meta_infos">Published on {{ last_message.publication_date
    }}</p>
      <p>{{ last_message.text }}</p>
      </article>

Comme il y a un raise Http404 (dans get_list_or_404 ou dans ma view avec
le raise, le else ne s'affichera jamais.
Dans tous les cas si le problème continue, il ne vient certainement pas
de la vue, mais plutôt de ta base de données.
Avec le order_by le problème ne devrait plus survenir, vérifie bien que
tu as fais un touch (commande unix) de django.wsgi une fois le code
modifié pour qu'il soit pris en compte.

Bonne soirée,

Rémy

Le 15/08/2012 20:28, philippe a écrit :
> Bonjour,
>
> Je suis en train d'apprendre django, et je viens de mettre mon projet en
> production avec Apache (mod_wsgi) sur Linux debian Squeeze.
> Basiquement, il s'agit d'un blog avec des messages, la page principale
> devant afficher le dernier post publié.
>
> Voici le code dans views.py:
>
>   def index(request):
>         messages =
> get_list_or_404(Message.objects.order_by('publication_date'))
>         last = messages[-1]
>         return render_to_response('posts/index.html', {
>            'last_message' : last,
>               
>            'posts_list'   : messages,
>         })
>
> Voici le code dans index.html
>
>   <article>
>   <h1><a href="/posts/{{ last_message.id }}">{{ last_message.title
> }}</a></h1>
>   <p class="meta_infos">Published on {{ last_message.publication_date
> }}</p>
>   <p>{{ last_message.text }}</p>
>   </article>
>
> Normalement, le dernier post s'affiche.
> Cependant, lorsque j'appuie sur F5, encore, et encore (pas comme un
> bourrin, mais toutes les secondes, par exemple) des fois, le premier
> message s'affiche au lieu du dernier.
>
> J'ai essayé ce code pour view.py:
>
> def index(request):
>     messages =
> get_list_or_404(Message.objects.order_by('publication_date'))
>     try:
>        last = Message.objects.order_by('publication_date')[0]
>     except IndexError:
>        raise Http404
>     return render_to_response('posts/index.html', {
>        'last_message' : last,
>        'posts_list'   : messages,
>     })
>
> avec le même résultat aléatoire: Des fois le dernier, des fois le
> premier post s'affiche.
>
> Je précise que lorsque je teste avec le serveur de développement de
> django, je n'ai pas ce comportement. Donc le problème viendrait d'apache?
> Rien de bizarre dans les logs pourtant.
>
> Merci pour m'aider à comprendre ce qui cloche ici hmm
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#4 15-08-2012 20:45:46

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Comportement aléatoire dans les views.py

get_list_or_404

ne s'utilise pas ainsi. On lui passe une classe, pas un queryset.

last = get_list_or_404(Message).order_by('-publication_date')[:1][0]

Me parait plus approprié:

- on lui passe bien le modèle, donc pas de risque qu'il retrie le queryset derrière
- on ordonne le résultat négativement, du coup le premier élément est le dernier
- on limite la requête pour ne retourner qu'une liste d'un élément: c'est plus rapide
- on récupère ensuite le premier et seul élément

Mais bon, Django fait déjà tout seul ça avec:

last = get_list_or_404(Message).latest('publication_date')

Dernière modification par ksamuel (15-08-2012 20:47:11)

Hors ligne

#5 15-08-2012 21:04:40

Rémy HUBSCHER
Membre
Inscription : 11-08-2010
Messages : 161

Re : Comportement aléatoire dans les views.py

Actually the docs says it is correct to passe a queryset :
https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#id6

    klass
        A Model
        <https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model>,
        Manager
        <https://docs.djangoproject.com/en/dev/topics/db/managers/#django.db.models.Manager>
        or QuerySet
        <https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet>
        instance from which to get the list.


Le 15/08/2012 21:45, ksamuel a écrit :
>

get_list_or_404

ne s'utilise pas ainsi. On lui passe une
> classe, pas un queryset.
>
>

> last = get_list_or_404(Message).

>
> Me parait plus approprié:
>
> - on lui passe bien le modèle, donc pas de risque qu'il retrie le
> queryset derrière
> - on ordonne le résultat négativement, du coup le premier élément est
> le dernier
> - on limite la requête pour ne retourner qu'une liste d'un élément:
> c'est plus rapide
> - on récupère ensuite le premier et seul élément
>
> Mais bon, Django fait déjà tout seul ça avec:
>
>

last = get_list_or_404(Message).latest('publication_date')

> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#6 15-08-2012 21:06:54

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Comportement aléatoire dans les views.py

Mea culpa then.

Hors ligne

#7 15-08-2012 22:59:03

philippe2
Membre
Inscription : 15-08-2012
Messages : 2

Re : Comportement aléatoire dans les views.py

Ok merci à vous! David, le soucis venait effectivement du serveur apache qui n'était pas rechargé.
Je trouve l'utilisation du latest plus concise que chercher le dernier indice de la liste des messages.
Merci encore!

Hors ligne

Pied de page des forums