web-dev-qa-db-fra.com

Django erreur - la requête correspondante n'existe pas)

J'ai finalement lancé mon projet au niveau de la production et j'ai soudainement rencontré des problèmes auxquels je n'avais jamais eu à faire face pendant la phase de développement.

Lorsque les utilisateurs publient des actions, j'obtiens parfois l'erreur suivante.

Traceback (most recent call last):

  File "/usr/local/lib/python2.7/dist-packages/Django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "home/ubuntu/server/opineer/comments/views.py", line 103, in comment_expand
    comment = Comment.objects.get(pk=comment_id)

  File "/usr/local/lib/python2.7/dist-packages/Django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)

  File "/usr/local/lib/python2.7/dist-packages/Django/db/models/query.py", line 366, in get
    % self.model._meta.object_name)

DoesNotExist: Comment matching query does not exist

Ce qui me frustre vraiment, c'est que le projet fonctionne bien dans l'environnement local et que l'objet de requête correspondant existe dans la base de données.

Maintenant, je soupçonne que l'utilisateur accède à la base de données lorsqu'elle est réservée à d'autres utilisateurs, mais il n'y a aucun moyen de prouver mon argument, ni de solution.

Est-ce que quelqu'un a déjà eu ce genre de problème? Des suggestions sur la façon de résoudre ce problème?

Merci beaucoup pour votre aide à l'avance.

EDIT: J'ai manuellement interrogé la base de données en utilisant les mêmes informations extraites du courrier électronique d'erreur de serveur que j'ai reçu. J'ai pu frapper l'entrée sans aucun problème. De plus, il semble que le même comportement exact de l'utilisateur ne pose pas de problème la plupart du temps, mais plutôt dans certains cas (encore inconnus). En conclusion, ce n'est certainement pas un problème avec l'entrée manquante dans la base de données.

60
Chris P

votre ligne soulevant l'erreur est ici:

comment = Comment.objects.get(pk=comment_id)

vous essayez d'accéder à un commentaire inexistant.

from Django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)

Au lieu d'avoir une erreur sur votre serveur, votre utilisateur obtiendra un 404, ce qui signifie qu'il essaie d'accéder à une ressource non existante.

Ok, je suppose que vous en êtes conscient.

Certains utilisateurs (et j'en fais partie) laissent les onglets fonctionner pendant une longue période. Si les utilisateurs sont autorisés à supprimer des données, cela peut arriver. Une erreur 404 peut être une meilleure erreur pour gérer une erreur de ressource supprimée que d'envoyer un courrier électronique à l'administrateur.

Les autres utilisateurs accèdent aux adresses de leur historique (de même si les données ont été supprimées, car cela peut arriver).

59
christophe31

Peut-être que vous n'avez pas d'enregistrement de commentaires avec une telle clé primaire, alors vous devriez utiliser ce code:

try:
    comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
    comment = None
70
Dracontis

Vous pouvez utiliser ceci:

comment = Comment.objects.filter(pk=comment_id)
16
Klang Wutcharin

Vous pouvez essayer de cette façon. utilisez simplement une fonction pour obtenir votre objet

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
5
Mehedi Hasan