Django中的Ajax调用失败

Posted

技术标签:

【中文标题】Django中的Ajax调用失败【英文标题】:Ajax call failing in Django 【发布时间】:2012-01-30 10:15:15 【问题描述】:

我有以下 ajax 调用来更新模型的特定字段

$("#updateLink").click(function()
    var dec_text = $('#desc_text').val();

    $.ajax(
        type: "POST",
        url:"/users/update_desc/",
        data: 
        'val': dec_text,
        ,
        success: function()
            $(".display, .edit").toggle();
            $("#descText").html(dec_text);
        ,
        error: function()
            alert("Error");
        ,
    );
    return false;
);

我的看法是这样的

@csrf_exempt
def update_desc(request):
    if request.is_ajax():
        if request.method == 'POST':
            desc_text = request.POST.get('val', False)
            if desc_text:
                profile = user.profile
                profile.desc = desc_text
                profile.save()

            return_message = "Sent mail"
            return HttpResponse(return_message,mimetype='application/javascript')

我经常收到一条错误消息,但我不知道如何解决这个问题。如果问题是由缺少csrf token 引起的,我什至使用csrf_exempt 装饰器来解决问题,但问题仍然存在。

除了一个ajax post,在我的base 模板中,所有的ajax 调用都失败了。任何人都可以帮助了解这里发生的事情。如果需要,我可以提供更多详细信息。

编辑:

我在我的基本模板中添加了一个包含此https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax 的js 文件,因此这意味着它存在于我的所有模板中。我正在使用 django 1.3 版本。

【问题讨论】:

我预计您仍然会收到 csrf_token 缺失错误。如果是这样,我的答案发布在下面,否则在您使用 csrf_exempt 后说明错误。 实际上我不知道如何得到错误,如您所见,我刚刚在error 回调中发出警报,告诉我我的 ajax 调用失败但它没有告诉我什么错误是。我怎样才能得到错误? 首先,在你的 settings.py 文件中 DEBUG = True。这不会显示您的 ajax 错误,但肯定会显示其他未满足的错误。 其次,下载FireBug。这是一个非常有用的调试工具。在那里你会有一个控制台面板。单击它并重新加载您的页面。这将显示任何失败的脚本。上线并复制错误或在另一个选项卡中打开它。如果是这样,这会将您带到崩溃页面 是的,我已经发送了,在添加您在下面给出的解决方案之前,我得到了这个[30/Dec/2011 13:27:36] "POST /users/update_desc/ HTTP/1.1" 500 94752 现在我根本没有看到正在发出的帖子,所以这意味着下面解决方案没有帮助。你能建议点别的吗。为什么我得到 500,我的 view 有问题吗? 【参考方案1】:

首先,您使用的是 POST,而不是发送 csrf 令牌。尝试显式发送 csrf 令牌,而不是使用装饰器 csrf_exempt。 一种方法是使用我在 data 中所做的。即获取 csrf 令牌(或从您自己的方法中)并将其传递到您的参数中。

$.ajax(
        url : url,
        type: "POST",
        data : csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value,
        dataType : "json",
        success: function( data )
            // do something
        
    );

【讨论】:

现在什么都没有发生,我只是在 url 的末尾看到一个 # 这意味着 return false 没有在事件处理程序中执行 按照上述 cmets 中列出的步骤进行操作。

以上是关于Django中的Ajax调用失败的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Ajax GET 调用中的数据值检索到 Django 视图中

Django如何通过单击带有变量的提交按钮从ajax调用views.py中的函数

带有重复 AJAX 调用的 Django 关闭套接字错误 [WinError 10053] 已建立的连接被主机中的软件中止

django - ajax - 从 jquery/ajax 调用 python 函数

前端 ajax POST 调用无法登录 Django

Ajax 调用不更新模板 django