我终于将我的项目发布到生产级别,突然间我遇到了一些我在开发阶段从未处理过的问题。
当用户发布一些操作时,我有时会收到以下错误。
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)
验证 id 是否存在于数据库中
也许您没有具有此类主键的 Comments 记录,那么您应该使用以下代码:
try:
comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
comment = None
您提出错误的行在这里:
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 错误可能比向管理员发送电子邮件更好。
其他用户会从他们的历史记录中访问地址(如果数据已被删除,则相同,因为它可能会发生)。
from django.db import connection
、connection.connection.close()
、connection.connection = None
以尝试重置数据库连接并从新连接开始。
你可以使用这个:
comment = Comment.objects.filter(pk=comment_id)
Model.objects.filter
将返回一个查询集,而 Model.objects.get
将返回一个对象。如果对象不存在,前者将返回一个空查询集,后者将导致 Model.DoesNotExist
错误。
Comment.objects.filter(pk=comment_id).first()
将返回 None
。
你可以试试这个方法。只需使用一个函数来获取您的对象
def get_object(self, id):
try:
return Comment.objects.get(pk=id)
except Comment.DoesNotExist:
return False
试试这个
comment, created = Comment.objects.get_or_create(pk=comment_id)
我认为问题在于您的开发服务器中已经传递了一些数据,这些数据不会迁移到您的生产服务器。
最简单的做法是在生产数据库中找到这些依赖项并提供它们
不定期副业成功案例分享
def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None
不知道如何在这里实现 try catch