Ajax Django csrf_令牌在chrome中为空

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

我有点奇怪的问题。我正在编写一个简单的小应用程序,需要将一些内容发布回django视图。我在这里遵循指南:设置ajax头并在我的js中包含以下代码:

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令牌。那是一个任务

总结一下。让这一切顺利进行

  • 通过使用RequestContext和@sure\u csrf\u cookie,确保将csrf令牌实际发送到要在其上使用它的页面

  • 确保{%csrf_token%}在表单中的某个位置

  • 将这里找到的特定于AJAX的代码添加到您的JavaScript页面

  • 确保通过以下方式将中间件令牌与ajax数据一起发送回:

    $.ajax({ 网址:“…”, 类型:“POST”, 数据类型:“…”, 数据:{ csrfmiddlewaretoken:csrftoken, ... },

  • 这应该可以做到

    $(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)