【问题标题】:jQuery $.post to Django returns "500 Internal Server Error"jQuery $.post 到 Django 返回“500 内部服务器错误”
【发布时间】:2011-08-21 22:36:41
【问题描述】:

我正在编写 jQuery 教程 (Link),但一直停留在“评价我:使用 AJAX”部分

jQuery:

 $(document).ready(function() {
   // generate markup
   $("#rating").append("Please rate: ");

   for ( var i = 1; i <= 5; i++ )
     $("#rating").append("<a href='#'>" + i + "</a> ");

   // add markup to container and apply click handlers to anchors
   $("#rating a").click(function(e){
     // stop normal link click
     e.preventDefault();

     // send request
     $.post("/vote", {rating: $(this).html()}, function(xml) {
       // format and output result
       $("#rating div").html(
         "Thanks for rating, current average: " +
         $("average", xml).text() +
         ", number of votes: " +
         $("count", xml).text()
       );
     });
   });
 });

urls.py:

urlpatterns = patterns('',
    (r'^rating/$', 'ajax_rating.views.rating'),
    (r'^vote/$', 'ajax_rating.views.vote'),
)

views.py:

@csrf_exempt
def vote(request):
    if request.is_ajax():
        rating = request['rating']
        f = open('ratings.dat', 'w')
        votes = json.load(f)
        votes.append(rating)
        f.close()
        dict = {}
        total_rating = sum(votes)
        dict['count'] = len(votes)
        dict['avg'] = total_rating / dict['count']
        return HttpResponse(serializers.serialize('xml', dict), 'application/xml')
    else:
        return HttpResponse(status=400)

基本上,html 让用户可以在 1 到 5 之间进行选择(锚点为 class=rating)。单击选项后,#rating div 将使用从服务器返回的计算结果进行刷新。

问题:当我点击一个选项时,我收到“HTTP 500 Internal Server Error”。甚至在请求到达视图函数 vote(request) 之前,错误就会发生。我试图找出错误的原因,但没有任何线索。我认为这与 csrf 没有任何关系,因为我在视图函数上使用 @csrf_exempt 并从 MIDDLEWARE_CLASSES 中取出了 'django.middleware.csrf.CsrfViewMiddleware'。

请帮忙~~谢谢各位专家

【问题讨论】:

  • 你能打开调试模式看看500是什么吗?
  • 调试模式已经开启。但是,不知何故,页面保持不变。
  • 如果您在 FF 中使用 firebug 或在 Chrome 中使用开发人员工具,您通常可以检查 500 响应以了解其内容。尝试在控制台中单击它。
  • 我试图在 Chrome 中执行此操作,但不确定它是否能够让我查看 500 响应的详细信息。既然你已经为我确认了这一点。我会弄清楚如何在 Chrome 中做到这一点。谢谢。
  • 打开控制台选项卡后,只需单击生成 500 响应的请求的 url。

标签: django jquery


【解决方案1】:

rating 不是request 上的有效密钥。您可能正在寻找request.POST['rating']。或者,为了安全起见,您不会抛出更多关键错误:

rating = request.POST.get('rating', None)
if rating is None:
    return HttpResponse(status=400) ## or some error.

【讨论】:

    【解决方案2】:

    我认为 POST 应该转到 URL /vote/ 而不仅仅是 /vote

    【讨论】:

    • 感谢您的回答,它帮助我解决了几个小时以来遇到的 500 错误。出于好奇,POST 需要以斜杠结尾的 URL 的任何特殊原因?让您的整个通话无法正常工作似乎是一件愚蠢的事情。
    • 我遇到了同样的问题。向www.example.com/data 发送 POST 请求无效并返回 HTTP 500,但 www.example.com/data/ 修复了返回 HTTP 200 的问题。
    • 如果 URL 在 urls.py 的末尾用斜线定义,那么你需要斜线。在这种情况下,自动重定向不起作用。
    • @Nitrex88 推测/vote/ 是正确的url,而APPEND_SLASH 设置会导致重定向。但它只是让用户访问新的 url,它不会导致向新的 url 发出具有相同数据的 post 请求。
    • 它也对我有用。不过看起来很可笑!
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多