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

时间:2015-04-11 16:17:50

标签: jquery python ajax django

这是一个Django项目,我必须编制一个在线商店。 在我的html中,我有一个id为“search”的表单,我在我的ajax代码中使用这个'id'来搜索和比较我创建的日期库。最后它必须在屏幕上显示我的可能数据日期基础像谷歌查找器。我的主要问题是CSRF,在控制台我有: “POST / search / 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>

我的views.py:

def search_title(request):

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(模板中使用了“A {%csrf_token%}”,但上下文没有提供值。这通常是由于不使用RequestContext引起的。“)

2 个答案:

答案 0 :(得分:1)

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

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

  • 使用{% url %}标记,而不是对js文件中的网址进行硬编码。

  • 使用{{ csrf_token }}而不是从中获取值 隐藏输入字段。

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

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

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

</script>
{% endblock %}

答案 1 :(得分:0)

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

ajax post请求应如下所示:

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