[英]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问题。
我想到两件事
您未通过身份验证。 您是登录( SessionAuthentication
),还是随请求发送用户名和api密钥( ApiKeyAuthentication
)。
如果不是#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.