W końcu wydałem swój projekt na poziom produkcyjny i nagle mam pewne problemy, z którymi nigdy nie miałem do czynienia w fazie rozwoju.
Kiedy użytkownicy publikują jakieś działania, czasami pojawia się następujący błąd.
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
To, co mnie naprawdę frustruje, to fakt, że projekt działa dobrze w środowisku lokalnym, a ponadto pasujący obiekt zapytania ISTNIEJE w bazie danych.
Teraz podejrzewam, że użytkownik uzyskuje dostęp do bazy danych, gdy jest ona zarezerwowana dla innych użytkowników, ale nie ma możliwości udowodnienia mojego argumentu ani nie mam na to żadnego rozwiązania.
Czy ktoś miał wcześniej tego typu problem? Jakieś sugestie, jak rozwiązać ten problem?
Z góry dziękuję za pomoc.
EDYCJA: ręcznie przeszukałem bazę danych, korzystając z tych samych informacji, które otrzymałem w wiadomości e-mail o błędzie serwera. Udało mi się trafić na wpis bez problemu. Ponadto wydaje się, że dokładnie to samo zachowanie, które wykonał użytkownik, przez większość czasu nie powoduje żadnego problemu, ale raczej w niektórych (jeszcze nieznanych) przypadkach. Podsumowując, na pewno nie jest to problem z brakującym wpisem w bazie danych.
źródło
comment = Comment.objects.get(pk=comment_id)
sprawdź, czy identyfikator istnieje w bazie danychOdpowiedzi:
Twoja linia podnosząca błąd jest tutaj:
comment = Comment.objects.get(pk=comment_id)
próbujesz uzyskać dostęp do nieistniejącego komentarza.
from django.shortcuts import get_object_or_404 comment = get_object_or_404(Comment, pk=comment_id)
Zamiast mieć błąd na serwerze, użytkownik otrzyma 404, co oznacza, że próbuje uzyskać dostęp do nieistniejącego zasobu.
Do tej pory ok, przypuszczam, że jesteś tego świadomy.
Niektórzy użytkownicy (a ja jestem ich częścią) pozwalają na działanie kart przez długi czas, jeśli użytkownicy mają uprawnienia do usuwania danych, może się tak zdarzyć. Błąd 404 może być lepszym błędem do obsługi błędu usuniętego zasobu niż wysłanie e-maila do administratora.
Inni użytkownicy przechodzą pod adresy ze swojej historii (tak samo, jeśli dane zostały usunięte, ponieważ może się to zdarzyć).
źródło
from django.db import connection
,connection.connection.close()
,connection.connection = None
aby spróbować przywrócić db połączenie i rozpocząć z nową.Może nie masz rekordu Komentarze z takim kluczem podstawowym, powinieneś użyć tego kodu:
try: comment = Comment.objects.get(pk=comment_id) except Comment.DoesNotExist: comment = None
źródło
def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None
nie wiem, jak zaimplementować tutaj try catchMożesz użyć tego:
comment = Comment.objects.filter(pk=comment_id)
źródło
Model.objects.filter
zwróci to Queryset, podczas gdyModel.objects.get
zwróci obiekt. Jeśli obiekt nie istnieje, pierwszy zwróci pusty zestaw zapytań, drugi spowodujeModel.DoesNotExist
błąd.Comment.objects.filter(pk=comment_id).first()
zwróci,None
jeśli nie zostaną znalezione żadne rekordy.Możesz spróbować w ten sposób. po prostu użyj funkcji, aby pobrać obiekt
def get_object(self, id): try: return Comment.objects.get(pk=id) except Comment.DoesNotExist: return False
źródło