【问题标题】:Django 1.9.2 + jQuery + POST - Error 403 - CSRF token missing or incorrectDjango 1.9.2 + jQuery + POST - 错误 403 - CSRF 令牌丢失或不正确
【发布时间】:2016-07-01 11:53:17
【问题描述】:

我是 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})

但它们都不起作用。

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

亲切的问候

【问题讨论】:

  • 您查看过 chrome 开发工具吗?您是否确认该令牌存在于您的 html 中?你检查过post请求吗?它是否也包含令牌?
  • 另一件事,与 django 无关,但与 js / html / jQuery 有关。如果您使用的是提交类型的按钮,则您也不需要添加点击处理程序。类型提交触发发布请求。第二个发布请求(通过 jQuery)可能在没有所需令牌的情况下发送
  • 如果我使用 chrome 开发工具,这些元素看起来像这样:
    。据我所知,包括令牌...我添加了单击处理程序来调用 django 函数..
  • 不,改用'action'属性
  • 并在 chrome 开发工具(在网络选项卡中)中查找请求标头,查看令牌是否传递给服务器..

标签: jquery python django post


【解决方案1】:

您似乎没有将 CSRF 令牌传递给服务器。查看the docs

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

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

【讨论】:

  • 老实说,我认为已经在第一行用“{% crsf token %}”完成了......如果我做对了,我应该从'Ajax'部分添加到我的项目功能中这份文件——但在哪里?我应该创建新的静态文件并将其与另一个 externaj js/jquery 文件一起包含到我的项目中?
  • 我通常做的是有一个全局的“ajax_util.js”文件,它首先来自我所有需要执行ajax请求的网页的头部。使用 Django 网站上的代码在此处设置标题,您就可以开始了。
  • 好的,所以我将把所有代码放在'ajax_util.js'中,但是接下来,我应该添加jQuery监听器来点击按钮上的事件并用它调用django函数吗?这会是比上面提到的更好的方法(因为使用 AJAX)吗?
【解决方案2】:

在一天结束时,我已经完成了这个教程:

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

而且效果很好。

感谢大家的关注。

【讨论】:

    【解决方案3】:

    我建议查看chrome开发者工具:

    1. 您是否确认该令牌存在于您的 html 中?
    2. 您检查过发布请求吗?它是否也包含令牌?

    这里的问题与js/html/jQuery有关。如果您使用的是提交类型的按钮,则您也不需要添加点击处理程序。带有type="submit" 的按钮触发发布请求。第二个发布请求(通过 jQuery)看起来是多余的,并且在没有所需令牌的情况下发送(否则您将通过它)。

    我建议使用'action'属性:

    <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>
    

    现在应该可以了..

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 2013-08-15
      • 2013-12-03
      • 2014-09-10
      • 2020-09-19
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多