プロジェクトを最終的に本番レベルにリリースしましたが、突然、開発段階で対処する必要のなかった問題がいくつかあります。
ユーザーがアクションを投稿すると、次のエラーが表示されることがあります。
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
私が本当にイライラするのは、プロジェクトがローカル環境で正常に機能し、さらに、一致するクエリオブジェクトがデータベースに存在することです。
今、私はユーザーが他のユーザーに予約されているときにデータベースにアクセスしているのではないかと疑っていますが、私の議論を証明する方法も解決策もありません。
誰も以前にこの種の問題を抱えていましたか?この問題を解決する方法に関する提案はありますか?
よろしくお願いします。
編集:私は私が受け取ったサーバーエラーメールから取得した同じ情報を使用して、手動でデータベースを照会しました。問題なくエントリーできました。さらに、ユーザーが実行したのとまったく同じ動作では、ほとんどの場合問題が発生しないようですが、一部の(まだ不明な)場合に発生します。結論として、それは間違いなくデータベースのエントリが欠落している問題ではありません。
エラーが発生した行は次のとおりです。
comment = Comment.objects.get(pk=comment_id)
存在しないコメントにアクセスしようとしました。
from Django.shortcuts import get_object_or_404
comment = get_object_or_404(Comment, pk=comment_id)
サーバーでエラーが発生する代わりに、ユーザーは404を受け取ります。これは、存在しないリソースにアクセスしようとしたことを意味します。
ここまででわかったと思います。
一部のユーザー(および私もその一部です)は、ユーザーがデータの削除を許可されている場合、タブが長時間実行されることを許可します。 404エラーは、管理者にメールを送信するよりも、削除されたリソースのエラーを処理するのに適したエラーです。
他のユーザーは、履歴からアドレスにアクセスします(データが発生する可能性があるためにデータが削除された場合も同じです)。
そのような主キーを持つコメントレコードがない場合は、次のコードを使用する必要があります。
try:
comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
comment = None
これを使用できます:
comment = Comment.objects.filter(pk=comment_id)
この方法を試すことができます。関数を使用してオブジェクトを取得するだけです
def get_object(self, id):
try:
return Comment.objects.get(pk=id)
except Comment.DoesNotExist:
return False