通过 jQuery 进行 ajax 调用时出现 403 错误

Posted

技术标签:

【中文标题】通过 jQuery 进行 ajax 调用时出现 403 错误【英文标题】:403 error when making an ajax call through jQuery 【发布时间】:2015-06-17 06:36:14 【问题描述】:

这是一个 Django 项目,我必须编写一个在线商店。 在我的 html 中,我有一个 ID 为“search”的表单,我在我的 ajax 代码中使用这个 'id' 来搜索并与我创建的日期库进行比较。最后它必须在屏幕上显示我的可能数据像谷歌查找器一样的日期库。我的大问题是 CSRF,在我的控制台中: “发布/搜索/HTTP/1.1”403 2295 我在此页面上看到有人遇到同样的问题,但我不知道失败在哪里。

这是我的 ajax 代码:

$("#search").keyup(function()

    var cadena = $("#search").val();
    var csrf = $("input[name=csrfmiddlewaretoken]").val();
    var token = $('input[name=""__RequestVerificationToken""]').val();
    if ( cadena.length > 2)
        alert(cadena);

        $.ajax(
            type:"POST",
            url: "http://127.0.0.1:8000/search/",
            data:'search_text':cadena,
                ''csrfmiddlewaretoken' : csrf,
            success:function(respuesta)
                $('#search-results').html(respuesta);
            

        );
       
);

);

我的模板(html):

        <td>
            % csrf_token %
            <input type="text" id="search" placeholder="Search"/>
            <ul id ="search-results"></ul>
        </td>

我的意见.py:

定义搜索标题(请求):

if request.method == "POST":
    search_text = request.POST['search_text']
    libros1 = Libros.objects.filter(nombre__contains=search_text)
    print("asda");
else:
    search_text =''
    libros1 = Libros.objects.filter(nombre__contains=search_text)

return render('ajax_search.html','libros':libros1)

我的网址:

 url(r'^admin/',include(admin.site.urls)),
 url(r'^$', 'views.home'),
 url(r'^(search)/', 'views.search_title'),
 url(r'^(libros)/', 'views.libros'),
 url(r'^(carrito)/', 'views.carrito')

在我的控制台中:

warnings.warn("模板中使用了% csrf_token %,但上下文没有提供值。这通常是由于没有使用RequestContext造成的。")

【问题讨论】:

您可以从浏览器的调试工具栏(例如for chrome)更轻松地调试 AJAX 活动。这将允许您检查来自服务器的确切响应和错误详细信息。 【参考方案1】:

Luca 的回答应该可以解决您的问题。我想分享一下我通常如何实现 AJAX POST 请求。我在模板(html)文件中编写 jQuery 代码。

我知道这不是最佳做法,但这样做可以让我

使用% url %标签而不是在js文件中硬编码url。

使用 csrf_token 而不是从 隐藏的输入字段。

通常,我的 base.html 文件中有一个名为 extrajs 的块(我在每个模板上扩展的那个)。

现在每当我需要包含 AJAX 功能时,我就是这样做的

% block extrajs %
<script>
...
$.ajax(
...
url:'% url "app_name.views.func_name" %',
data: ... ,'csrfmiddlewaretoken':' csrf_token ', ... ,
...
);

</script>
% endblock %

【讨论】:

我已经尝试过你的答案,但我遇到了这个问题:“tienda.views.search_title”的反向参数“()”和关键字参数“”未找到。尝试了 0 个模式:[] 你能发布你的 urls.py 文件吗 之前我也写过 url:'% url 'app_name.views.func_name' %' .... 我已将其更正为 url:' % url "app_name.views.func_name" %' 我使用 firefox 调试发布了我的 urls.py.Im,它检测到 url 中的失败【参考方案2】:

我的建议是您应该确保 csrf 令牌关键字与处理它的中间件内联(在您的 ajax 中它是 csrtoken)。在我的 django 应用程序中,令牌称为 csrfmiddlewaretoken

ajax 发布请求应如下所示:

        $.ajax(
        type:"POST",
        url: "http://127.0.0.1:8000/search/",
        data:'search_text':cadena,
            'csrfmiddlewaretoken' : csrf,
        success:function(respuesta)
            $('#search-results').html(respuesta);
        

【讨论】:

我改了,结果还是一样 @AlbitaVadillo 我在谈论您的 ajax 发布请求的数据部分中的“csrtoken”。 我也是这样,不知道为什么不行,你觉得可能是电脑问题?在控制台中我得到:warnings.warn("A % csrf_token % was used in a template, but context does not provide the value.这通常是由于没有使用 RequestContext.") 您是否将 'django.middleware.csrf.CsrfViewMiddleware' 添加到设置文件 MIDDLEWARE_CLASSES 部分? 试试这个:在你的views.py的最后一行,做return render(request, 'ajax_search.html','libros':libros1)

以上是关于通过 jQuery 进行 ajax 调用时出现 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 ajax 调用 Mvc-4 应用程序中实现验证时出现错误

在参数数据中使用特殊字符调用 Ajax 时出现问题

下拉菜单在第一页加载时出现延迟

从 Ajax 调用 Spring Boot Rest API 时出现 CORS 错误

Ajax 调用返回未定义

尝试使用 jQuery ajax 和 MVC 显示 JSONResult 时出现内部服务器错误 #500