我在尝试使用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
});
});
});
我之前问过this问题,因为我觉得它会有所帮助,但它还没有。它有更多的背景,即关于我用于auth的内容,但如果需要,我可以提供更多细节。
答案 0 :(得分:0)
401
通常意味着您无权访问该资源,或者存在CSRF问题。
有两件事让人想起
您未经过身份验证。您是否已登录(SessionAuthentication
),或者是否根据您的请求(ApiKeyAuthentication
)发送了用户名和API密钥。
如果#1不是问题,那么可能是因为尚未设置csrf令牌。 Django没有为所有请求设置令牌。来自docs -
如果您的视图没有呈现包含csrf_token模板标记的模板,Django可能不会设置CSRF令牌cookie。这在表单动态添加到页面的情况下很常见。为解决这种情况,Django提供了一个视图装饰器,它强制设置cookie:ensure_csrf_cookie()。
我猜测#2更像是情景。您可以将视图包装在ensure_csrf_cookie
装饰器中,也可以使用中间件为所有请求执行此操作。或者您可以使用api密钥进行身份验证,因为它看起来不像是检查csrf令牌(不是很确定,但我正在查看tastypie代码,我没有看到任何csrf检查。)