我在localhost:8000有一个后端服务器,在localhost:3000有一个前端服务器。后端是Django,我安装了corsheaders包,我发出GET请求没有问题。当我打开我的网站时,第一个GET请求成功设置了一个CSRF令牌(我可以在开发工具中看到cookie)。
我在settings.py中有这个:
CORS_ORIGIN_WHITELIST = (
'localhost:3000'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT'
)
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
CSRF_TRUSTED_ORIGINS = (
'localhost:3000',
)
CORS_ALLOW_CREDENTIALS = True
现在我正在尝试发出POST请求,而且我经常被服务器拒绝:
403 - Forbidden (CSRF cookie not set.): /myapp/myview/
这就是我的JS的样子:
let csrftoken = utils.getCookie('csrftoken'); // logged this on the console, the token is really here
jQuery.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}); // this might be wrong - I did read it is used only if it's not cross site, but I still gave it a try
jQuery.ajax({
url: url,
type: 'POST',
data: {attr: value, csrfmiddlewaretoken: csrftoken}
})...
我在AJAX数据中只尝试过csrfmiddlewaretoken。我只尝试过设置请求标头。我试过了两个。仍然没有运气。我显然遗漏了一些东西;我之前从未尝试过在Django中跨站点进行POST。
有什么建议吗?
编辑:我发现问题出在其他地方。答案 0 :(得分:0)
尝试将XSRF-Token放入Ajax请求的Header中。
$.ajax({
url : urlToCall, // the endpoint
type : "POST", // http method
headers: { "X-CSRFToken": "your token here" },
success : function(response) {
console.log('success', response);
},
error : function(xhr,errmsg,err) {
console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
}
});
答案 1 :(得分:0)
我能够做到:
$.ajax({
url : urlToCall, // the endpoint
type : "POST", // http method
data : {
csrfmiddlewaretoken: "Your token",
data...
},
success : function(response) {
console.log('success', response);
},
error : function(xhr,errmsg,err) {
console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
}
});
希望它有所帮助!