什么会导致 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调用

多个 ajax 调用导致混合数据集

jquery $.ajax 在 Chrome 或 Firefox 中调用会导致 401 未经授权的响应,但在 IE 中有效

jQuery 的 ajax 导致 FireFox 中的整个页面刷新

什么因素会导致 jquery.ajax 每次都认为响应是错误的

使用 jQuery 中止 JSONP ajax 请求