繁体   English   中英

我的好吃的POST请求出了什么问题?

[英]What's wrong with my tastypie POST request?

当我尝试与Tastypie在ajax中发表文章时,我得到了401。 我可以将GET登录到控制台,并且它们使用相同的身份验证。 我该如何调试?

这是我的JavaScript:

// sending a csrftoken with every ajax request
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: true, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
        }
    }
});

//this is the get request, which works fine
$.ajax({
   url: "http://localhost:8080/data/api/v1/user/?format=json",
   success: function(data){
console.log(data);
}
});

$(function() {
  $('#newEntry').click(function() {
   var table=$("#entryName").val(); 
   var d = JSON.stringify({
    "name":entry,
    "user":"http://localhost:8080/data/api/v1/user/?format=json"
    });

    $.ajax({
      type: 'POST',
      data: d,
      success: function(r) {console.log(r); },
      error: function(r){console.log(r); },
      url: 'http://localhost:8080/data/api/v1/entry/',
      cache:false
    });
  });
});

我早些时候问过这个问题,因为我认为这会有所帮助,但没有成功。 它具有更多的上下文,即有关我用于身份验证的内容,但是如果需要,我可以提供更多详细信息。

401通常意味着您无权访问该资源,或者存在CSRF问题。

我想到两件事

  1. 您未通过身份验证。 您是登录( SessionAuthentication ),还是随请求发送用户名和api密钥( ApiKeyAuthentication )。

  2. 如果不是#1的问题,则可能是因为尚未设置csrf令牌。 Django不会为所有请求设置令牌。 文档 -

如果您的视图未呈现包含csrf_token模板标记的模板,则Django可能未设置CSRF令牌cookie。 在将表单动态添加到页面的情况下,这很常见。 为了解决这种情况,Django提供了一个视图装饰器来强制设置cookie: sure_csrf_cookie()

我猜想#2更像场景。 您可以将视图包装在ensure_csrf_cookie装饰器中,也可以使用中间件对所有请求执行此操作。 或者,您也可以使用api密钥进行身份验证,因为它看起来并不像它检查的csrf令牌(不是很确定,但是我正在查看密码代码,但没有看到任何csrf的检查。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM