【问题标题】:403 error when making an ajax call through jQuery通过 jQuery 进行 ajax 调用时出现 403 错误
【发布时间】: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 活动。这将允许您检查来自服务器的确切响应和错误详细信息。

标签: jquery python ajax django


【解决方案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})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2015-03-03
  • 2014-02-21
  • 2019-08-16
  • 2022-07-11
相关资源
最近更新 更多