Django 1.9.2 + jQuery + POST - 错误403 - CSRF令牌丢失或不正确

时间:2016-03-15 20:28:43

标签: jquery python django post

我是django的新手,我正试图通过点击网页上的按钮从views.py中激活简单的功能。这就是我所做的:

HTML:

<form method="post">{% csrf_token %}
<button type="submit" class="btn btn-circle btn-primary btn-xl" id="add_address_button"><i class="fa fa-check"></i></button>
</form>

    $('#add_address_button').click( function() {
        $.post("adres/add_address_button_action/", function () {
            alert('OK');
        });
    });

urls.py

url(r'^adres/add_address_button_action/$',views.add_address_button_action, name = 'add_address_button_action'),

views.py

def add_address_button_action(request):    
    adres = get_object_or_404(Adres, id =2) 
    return render(request, 'serwis/address_detail.html', RequestContext(request,  {'address_detail_zmienna': adres}))

来自终端的信息:

Forbidden (CSRF token missing or incorrect.): /adres/add_address_button_action/ 
...
"POST /adres/add_address_button_action/ HTTP/1.1" 403 2274

我在views.py中尝试了不同的回报:

return render_to_response('serwis/address_detail.html', RequestContext(request, {'address_detail_zmienna': adres}))
return redirect('serwis/address_detail.html', {'address_detail_zmienna': adres})

但它们都不起作用。

如果有人能帮我解决这个问题,我将非常感激。 我已经阅读了很多关于这个问题的主题,但是大多数都是过时的 - 并没有帮助。

亲切的问候

3 个答案:

答案 0 :(得分:2)

看起来您没有将CSRF令牌传递给服务器。见https://docs.djangoproject.com/en/1.9/ref/csrf/#how-to-use-it

您需要预先配置jQuery以在您所做的每个AJAX请求的标头中传递csrf标记,或者您需要将CSRF标记作为数据显式传递给$ .post()函数。

上述链接文档中提供了详细代码。

答案 1 :(得分:1)

在一天结束时,我遵循了本教程:

https://impythonist.wordpress.com/2015/06/16/django-with-ajax-a-modern-client-server-communication-practise/

这非常有效。

谢谢大家的关注。

答案 2 :(得分:0)

我建议查看chrome开发人员工具:

  1. 您是否验证了html中是否存在该令牌?
  2. 您是否检查过邮件请求?它是否也包含令牌?
  3. 这里的问题与js / html / jQuery有关。如果您使用提交类型的按钮,则不需要添加点击处理程序。具有type="submit"触发器发布请求的按钮..第二个发布请求(通过jQuery)看起来是多余的并且在没有所需令牌的情况下发送(否则您将通过它)。

    我建议使用&#39; action&#39;属性:

    <form method="post" action="adres/add_address_button_action/">
        {% csrf_token %}
        <button type="submit" class="btn btn-circle btn-primary btn-xl" id="add_address_button"><i class="fa fa-check"></i></button>
    </form>
    

    现在它应该有用..