什么会导致 AJAX 调用的 HttpResponse 出现 500 错误?
Posted
技术标签:
【中文标题】什么会导致 AJAX 调用的 HttpResponse 出现 500 错误?【英文标题】:What can cause a 500 error in a HttpResponse to an AJAX call? 【发布时间】:2012-09-03 21:05:14 【问题描述】:编辑市长对问题和文本进行了更改,以使其清晰。事实证明,该错误是由一个非常愚蠢的错误引起的,即我忘记将 HttpResponse 导入到我的 views.py 中。由于在同一个views.py中我处理了另一个视图,我假设它是导入的。菜鸟失误。 :(
问题: 我正在尝试通过 ajax 提交赞成或反对票。显然,我认为大多数代码都已执行,然后在返回响应时失败。问题是django没有显示错误;我在终端中获得的唯一信息是:“POST /c/vote/ HTTP/1.1”500 10814。其中 /c/vote/ 是应该处理投票的 URL。
Chrome 中的控制台也没有多大帮助。我得到的错误是“加载资源失败:服务器响应状态为 500(内部服务器错误)”,然后如果我单击链接,我将被重定向到 /c/vote/,其中 django 返回 404。注意我在不同的网址投票(即/c/<country>/
)
我发现投票实际上正在保存或删除,因此问题可能出在返回响应时。
我的模板(自定义模板标签以了解用户之前是否投票):
<div class="vote_buttons" x:id="linkpost.pk">
<a href="#" class="upVote% if linkpost|is_up_voted_by:user % voted%endif%" x:value="1" ></a>
<a href="#" class="downVote% if linkpost|is_down_voted_by:user % voted%endif%" x:value="-1"></a>
js 代码(我使用的是 JQuery)。变量 vote_url 使用模板标签传递。:
<script type="text/javascript">
$(document).ready(function()
$(".vote_buttons").bind("vote", function(event, value)
var vote_el = $(this);
$.ajax(
type:'POST',
url: ' vote_url ',
data:
'pk': vote_el.attr("x:id"),
'delta': value
,
dataType: "json",
success : function(data, textStatus, jqXHR)
switch (data.voted_as)
case 1:
vote_el.find("a.upVote").addClass("voted");
vote_el.find("a.downVote").removeClass("voted");
break;
case -1:
vote_el.find("a.upVote").removeClass("voted");
vote_el.find("a.downVote").addClass("voted");
break;
,
);
);
$('.upVote, .downVote').click(function()
$(this).parent().trigger("vote", $(this).attr("x:value"));
return false;
);
);
</script>
最后是视图。我添加了一些打印语句来确定它在哪里失败。感谢@Steven,代码一直执行到第 12 步。然后出现前面提到的错误。
def vote(request):
"""
Likes or dislikes a linkpost.
"""
print "Setp 1 ok!"
#User must be authenticated to vote.
if request.is_ajax():
print "Step 2 ok"
if request.method == 'POST' and request.user.is_authenticated():
print "Step 3 ok"
delta = request.POST['delta']
# In case an error occurrs with delta value
try:
delta = int(delta)
print "Step 4 ok"
except ValueError:
print "Error was value error"
return HttpResponse("'success': 'false'")
# You can only vote upwards or downwards
if not delta in (1, -1):
print "Error was in delta"
return HttpResponse("'success': 'false'")
print "Step 5 ok"
#We check if the linkpost actually exists!
LinkPost = get_model('company', 'LinkPost')
try:
linkpost = LinkPost.objects.get(pk=request.POST['pk'])
print "Step 6 ok"
except LinkPost.DoesNotExist:
print "Link object does not exist"
return HttpResponse("'success': 'false'")
#We check if the user voted before.
Vote = get_model('company', 'Vote')
try:
vote = Vote.objects.get(linkpost = linkpost, listener = request.user)
print "Step 7 ok!"
except Vote.DoesNotExist:
print "Vote doesn't exists!"
vote = None
# If there is already a vote
if vote:
print "Step 8."
if vote.delta == delta:
vote.delete()
else:
print "Step 9."
vote.delta = delta
vote.save()
#There wasn't a vote, we create one.
else:
print "Step 10."
Vote.objects.create(linkpost = linkpost,
listener = request.user,
delta = request.POST['delta'])
response_dict = 'success' : 'true', 'voted_as': delta
print "Step 12."
return HttpResponse(simplejson.dumps(response_dict), mimetype="application/json")
else:
print "User not authenticated"
raise Http404('What are you doing here?')
else:
print "Request isn't ajax"
raise Http404('What are you doing here?')
任何解决问题的帮助将不胜感激!如果问题仍然不清楚,我会尝试澄清或添加尽可能多的信息!
【问题讨论】:
我看不到你在哪里将 vote_url
变量传递给模板。您的 ajax 请求地址是否正确?
嗨,对不起!我对此很陌生,找不到追踪错误的方法。编辑了我的问题以显示错误以及我如何将 vote_url 传递给模板。
继续编辑问题。您无需费心标记每个编辑是什么。如果这样更清楚,那就发疯并重新格式化整个事情。主要目标是使问题足够明显,以便人们快速理解它。您仍然太困惑/困惑,无法提出真正的问题。巧妙地提出问题的练习很常见,可以提高您对正在发生的事情的理解,您可以自己解决问题;或得到有用的答案。确保调试已打开,以便您查看 500 错误的原因。
对齐/清理代码,以便其他人更容易理解您的问题并更好地帮助您。当您发现一些改进时更新问题。
谢谢大家,我希望现在一切都清楚了。如果仍然不清楚,请告诉我,以便我做出适当的更改。
【参考方案1】:
试试:
response_dict = "'success' : 'true', 'voted_as': '%s'" % (delta)
您的代码中的 % 运算符后面有一个无关的 s。应该是% (delta)
此外,假设您设置了 DEBUG=True,您应该会发现可以在浏览器开发人员工具中看到 Django 的信息错误页面(检查网络部分)。格式可能已关闭,但它仍然可以帮助您更快地解决代码错误。
编辑:OP 修正错字详述如下:
如果这不是您的问题中的拼写错误:except Vote.DoesNotExists:
那么你可能会有更多的运气:
except Vote.DoesNotExist:
【讨论】:
嗨,好眼力。显然这不是可能的问题,但它有助于弄清楚视图中的大部分代码正在执行。谢谢! 谢谢,这实际上帮了很多忙。代码现在一直执行到第 12 步!我正在更新这个问题,因为我认为问题是一旦返回 HttpResponse,JS 代码就无法确定要修改哪些 css 元素。也许我需要在字典中返回更多信息或修改js。 @JaimeVaqueiroT。正如我在对您的问题的评论中指出的那样,您正在对字符串进行 JSON 编码,您可能希望在其中对字典进行 JSON 编码。请改用response_dict = 'success':True, 'voted_as': delta
。
更新了问题,字典实际上是字典。还是一样的问题……
@Steven... 刚刚发现了问题所在。我觉得我好笨。除了您充分指出的错误之外,我忘记将 HttpResponse 导入到我的 views.py 中。这导致了 500 错误。我真的很感谢你的帮助。谢谢。以上是关于什么会导致 AJAX 调用的 HttpResponse 出现 500 错误?的主要内容,如果未能解决你的问题,请参考以下文章
yii cgridview refresh导致多个ajax调用
jquery $.ajax 在 Chrome 或 Firefox 中调用会导致 401 未经授权的响应,但在 IE 中有效
jQuery 的 ajax 导致 FireFox 中的整个页面刷新