I finally released my project to the production level and suddenly I have some issues I never had to deal with in the development phase.
When the users posts some actions, I sometimes get the following error.
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
What really frustrates me is that the project works fine in the local environment and furthermore, the matching query object DOES exist in the Database.
Now I am suspecting that the user is accessing the Database when it's reserved to other users, but there's no way to prove my argument nor I have any solution to it.
Does anybody had this kind of issue before? Any suggestions on how to resolve this issue?
Thank you very much for your help in advance.
EDIT: I have manually queried the database using the same information retrieved from the server error email I received. I was able to hit the entry without any issue. Furthermore, it seems like the exact same behavior the user performed does not raise any issue most of the time, but rather in some (which is yet unknown) cases. In conclusion, it definitely is not an issue with the missing entry in the database.
comment = Comment.objects.get(pk=comment_id)
verify the id exists in the database
Maybe you have no Comments record with such primary key, then you should use this code:
try:
comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
comment = None
your line raising the error is here:
comment = Comment.objects.get(pk=comment_id)
you try to access a non-existing comment.
from django.shortcuts import get_object_or_404
comment = get_object_or_404(Comment, pk=comment_id)
Instead of having an error on your server, your user will get a 404 meaning that he tries to access a non existing resource.
Ok up to here I suppose you are aware of this.
Some users (and I'm part of them) let tabs running for long time, if users are authorized to delete data, it may happens. A 404 error may be a better error to handle a deleted resource error than sending an email to the admin.
Other users go to addresses from their history, (same if data have been deleted since it may happens).
from django.db import connection
, connection.connection.close()
, connection.connection = None
to try to reset db connection and start from a new one.
You can use this:
comment = Comment.objects.filter(pk=comment_id)
Model.objects.filter
will return a Queryset, whereas Model.objects.get
will return an object. If the object doesn't exist, the former will return an empty queryset, the latter will result in a Model.DoesNotExist
error.
Comment.objects.filter(pk=comment_id).first()
will return None
if no records are found.
You may try this way. just use a function to get your object
def get_object(self, id):
try:
return Comment.objects.get(pk=id)
except Comment.DoesNotExist:
return False
Try this one
comment, created = Comment.objects.get_or_create(pk=comment_id)
I think the problem is that there is some data that has been passed in your dev server that wouldn't be migrated to your Production server.
The easiest thing to do will be to locate those dependencies on your production database and provide them
Success story sharing
def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None
dont know how to implement the try catch here