【问题标题】:Forbidden (CSRF token missing or incorrect.):禁止(CSRF 令牌丢失或不正确。):
【发布时间】:2016-03-29 17:32:17
【问题描述】:

我正在像下面这样进行 ajax 调用:

var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken': '{{ csrf_token }}'};
    $.ajax({
        type: 'POST',
        url:"/issuebook",
        data:data_dict,
        processData: false,
        contentType: false,
        success:function(response)
        {
        }
    });

urls.py 是:

urlpatterns = [
url(r'^$',views.checkLogin,name='checklogin'),
url(r'^mylibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.MyLibrary.as_view()),name='mylibrary'),
url(r'^centrallibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.CentralLibrary.as_view()),name='centrallibrary'),
url(r'^issuebook$',login_required(views.IssueBookView.as_view()),name='issuebook'), 

]

我在 ajax 调用时收到“禁止(CSRF 令牌丢失或不正确。):/issuebook”错误。

ajax 调用中的 csrf 令牌呈现为:

var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken':'fSSdu8dJ4FO6FvDz8eU5ISzOewRYyGbC'};
                    $.ajax({
                        type: 'POST',
                        url:"/issuebook",
                        data:data_dict,
                        contentType: false,
                        success:function(response)
                        {
                        }
                    });

【问题讨论】:

  • 您刚刚将字符串'{{ csrf_token }}' 传递为csrfmiddlewaretoken,并且您的ajax 调用无法将其与相对的匹配。相反,您可以从调用函数中的 html 手动获取 csrf 令牌的哈希值。
  • 在问题中添加渲染的 HTML 模板。
  • @v1k45 我在已编辑的问题中添加了渲染的 {{ csrf_token }}。除此之外,我只是在模板中渲染几个字符串值,这些值工作正常
  • @v1k45 我也没有在模板中使用任何表单。此 ajax 调用是在按钮单击事件上完成的
  • 尝试在ajax请求中将X-CSRFToken请求头设置为csrftoken

标签: django django-csrf


【解决方案1】:

此错误是由您的 ajax 函数中的processDatacontentType 选项引起的。删除这两个选项将解决此问题。

解释: 参数必须以 Content-Type application/x-www-form-urlencoded 的 urlencoded 形式发送到 Django。然而,如果您设置processData: false,它不会对 POST 参数进行编码,contentType: false 将发送 ajax POST 请求为text/plain

【讨论】:

  • 如果设置成这个怎么办?内容类型:应用程序/json;charset=UTF-8。那会奏效吗?我得到与上面相同的错误。
  • @Axwack 不,它不会工作。 Django 不理解application/json POST 请求。尝试以Content-Type: application/x-www-form-urlencoded 发送数据。如果您无法控制请求,还有另一种方式可以接受json 请求。如果你想知道,我会再发表评论。
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 2021-01-08
  • 2021-02-23
  • 2015-10-15
  • 2020-12-24
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多