我在Django后端有一个名为getUserInfo
的视图,该视图将以json格式返回用户的信息。
这是我的观点:
@api_view(["POST"])
def getUserInfo(request):
if request.user.username:
serial = userInfoSerializer(request.user)
return Response(serial.data)
else:
return Response({"notLoggedIn": True})
当我未登录时,ajax请求工作正常,但是当我登录到用户帐户时,出现“禁止”错误,它说csrf验证失败。每当用户登录或注销时,我也会刷新csrf令牌。
因此它应该工作,但是不工作。
这是我的ajax请求:
function login(){
getcsrf();
$.ajax({
url: '/api/login/',
type: 'POST',
headers: {
"XCSRF_TOKEN": csrf
},
data: {
username: $("#l-username").val(),
password: $("#l-password").val(),
},
})
.done(function(data) {
console.log(data)
if(data.msg){
console.log(data.msg)
$(`<div class="p-2 bg-danger">`+data.msg+`</div>`).prependTo('#message-box')
}else{
getcsrf();
getUserInfo();
}
console.log("success");
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
}
函数getcsrf
刷新包含名为“ csrf”的csrf令牌值的全局变量,然后发送我的ajax请求。请求后,我再次刷新它。我确定每次用户登录或注销时,每次刷新时,csrf令牌的值都会更改,但是服务器始终显示“禁止”。
我已将此代码插入我的settings.py文件:
CSRF_HEADER_NAME = "HTTP_XCSRF_TOKEN"
并且我正在发送带有名为XCSRF_TOKEN的标头的ajax请求
有人可以帮助我吗?
对我的英语感到抱歉
也许尝试:
headers: {
"HTTP_XCSRF_TOKEN": csrf
},
以使其与您的设置文件中的标题名称匹配。
我认为添加如下所示的标题会起作用。并且我知道您应该将令牌放在标头中。
headers: {
'Authorization':'Basic 55555555555555',
'X-CSRF-TOKEN':'333333333333333',
'Content-Type':'application/json'
},