Ajax Django csrf_令牌在chrome中为空
我有点奇怪的问题。我正在编写一个简单的小应用程序,需要将一些内容发布回django视图。我在这里遵循指南:设置ajax头并在我的js中包含以下代码:Ajax Django csrf_令牌在chrome中为空,ajax,post,django-views,csrf,django-csrf,Ajax,Post,Django Views,Csrf,Django Csrf,我有点奇怪的问题。我正在编写一个简单的小应用程序,需要将一些内容发布回django视图。我在这里遵循指南:设置ajax头并在我的js中包含以下代码: function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i
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;
}
var csrftoken = getCookie('csrftoken');
console.log(csrftoken)
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
现在,当我使用firefox在本地机器上运行应用程序时,我会在控制台上打印一个有效的csrf令牌。如果我在本地机器上用chrome或IE启动应用程序,我会得到一个空值。同样的行为也在现场得到了回应。我正在使用linux(mint),奇怪的是,如果我在windows机器上的firefox中启动应用程序,它在firefox中也会返回null。这里发生了奇怪的事情!有什么想法吗?我似乎正在做django文档中建议的事情
更新:
我在我的索引视图中添加了@sure_csrf_cookie,现在我在本地机器上的两个Broswer上都打印了一个令牌。但是,该代码在我的live server上不起作用。如果我在我的js中丢弃一些随机的console.log,它会显示在实时服务器上,这样代码就可以运行了。我真是不知所措
更新2:
因此,我确定问题在于,在我的live站点上,没有设置document.cookie属性。我猜csrftoken=“…”cookie是由django设置的。它似乎是在我的本地机器上设置的,但不是在我的实时站点上。代码相同:/。这到底是怎么回事 好的。我发现了问题!这是一个简单的例子,一开始并没有将csrf令牌发送到html页面。我关注的是ajax调用,这实际上是正确的 我将实际呈现页面的视图更改为:
@ensure_csrf_cookie
def index(request):
context = RequestContext(request)
return render_to_response('vis_it_app/index.html', context)
这里的键是'RequestContext',默认情况下,它也发送csfr令牌。那是一个任务
总结一下。让这一切顺利进行
$(function() {
$("#map-id-btn").click(function() {
checkMapID();
})
})
function checkMapID() {
var mapId = $("#map-id-input").val();
$.ajax({
url: "check_map_id/",
type: "POST",
dataType: "json",
data: {
csrfmiddlewaretoken: csrftoken,
map_id: mapId,
},
success: function(status_dict) {
if (status_dict.status === 1) {
$("#status").html("Valid map ID <br> Loading Data...")
window.location = status_dict.url;
}
else {
$("#status").html("Invalid map ID. Please try again, or contact ...")
}
},
error: function(result) {
console.log(result)
}
});
}
@ensure_csrf_cookie
def check_map_id(request):
map_id = request.POST['map_id']
if map_id not in GEOJSON_LOOKUP.keys():
status = json.dumps({
'status': 0,
'url': '',
})
return HttpResponse(status, content_type="application/json")
else:
status = json.dumps({
'status': 1,
'url': reverse('map', args=(map_id,)),
})
return HttpResponse(status, content_type="application/json")
@ensure_csrf_cookie
def index(request):
context = RequestContext(request)
return render_to_response('vis_it_app/index.html', context)