【发布时间】:2015-10-02 23:59:37
【问题描述】:
我在 Linux 上开发了我的应用程序,并且 AJAX 请求工作正常。我已将应用程序拉到 Windows 机器上,但 AJAX 请求失败,我只收到 403 Forbidden 错误。从网上看,我认为是csrf令牌的问题。在 Linux 中,我可以在 AJAX 请求的 Cookies 下看到csrftoken:"AjQzJy3tRZ2awslgdibkDTvQgANFQKmP"。我没有在 Windows 中看到任何 cookie 设置。
这是我用来获取 csrf cookie 的 Javascript 代码。来自https://docs.djangoproject.com/en/1.8/ref/csrf/
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
这是我提交 AJAX 请求的地方:
function refreshInformation(){
$.ajax({
type: "POST",
url: "get_flows_info",
data: {
csrfmiddlewaretoken: getCookie('csrftoken')
}
dataType : "json",
async : true,
error : function(data){
alert('AJAX error:' + data);
},
success : function(json_data){
// do stuff...
},
});
}
这是被请求的视图:
def get_flows_info(request):
if request.is_ajax():
# do stuff...
return HttpResponse(json.dumps(ret), content_type='application/json')
我发现了这个:Django CSRF check failing with an Ajax POST request 但 jQuery 没有任何区别。
有什么帮助吗?
谢谢。
【问题讨论】:
-
您是否尝试发送
X-CSRFToken标头? -
另外,
getCookie('csrftoken')调用返回什么?我假设CSRF_COOKIE_NAME有它的默认值。 -
在 Linux 上返回
AjQzJy3tRZ2awslgdibkDTvQgANFQKmP,在 Windows 上返回 null...