javascript - Django 的 CSRF 验证失败,尽管 Firebug 说 cookies 选项卡下有一个 csrftoken。为什么?

标签 javascript python django csrf django-csrf

我遵循了 StackOverflow 上推荐的很多内容,但无济于事。我还尝试在 html 的各个地方挤入 {% csrf_token %} 但似乎都没有用。有什么建议么?这是我的 Django 模板输入按钮:

<input id=saveWaypoints type=button value=Save disabled=disabled>

然后触发此 Javascript:

$('#saveWaypoints').click(function () {
    var waypointStrings = [];
    for (id in waypointByID) {
        waypoint = waypointByID[id];
        waypointStrings.push(id + ' ' + waypoint.lng + ' ' + waypoint.lat);
    };
    waypointStrings["csrfmiddlewaretoken"] = $('input[name=csrfmiddlewaretoken]').val();
    $.post("{% url 'waypoints-save' %}", {
        waypointsPayload: waypointStrings.join('\n')
    }, function (data) {
        if (data.isOk) {
            $('#saveWaypoints').attr('disabled', 'disabled');
        } else {
            alert(data.message);
        }
    });
});

然后在 views.py 中调用这个 View :

def save(request):
    'Save waypoints'
    for waypointString in request.POST.get('waypointsPayload', '').splitlines():
        waypointID, waypointX, waypointY = waypointString.split()
        waypoint = Waypoint.objects.get(id=int(waypointID))
        waypoint.geometry.set_x(float(waypointX))
        waypoint.geometry.set_y(float(waypointY))
        waypoint.save()
    return HttpResponse(simplejson.dumps(dict(isOk=1)), content_type='application/json')

最佳答案

根据 django 文档,您可以将 token 作为请求的 header 将其添加为负载 https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax

你快到了,但你只需要将它作为自己的参数发送,而不是 waypointsPayload 的一部分:

$.post("{% url 'waypoints-save' %}", {
  csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
  waypointsPayload: waypointStrings.join('\n')
}, function (data) {
  ...
});

cookie 是一个替代位置,用于读取 token ,而不是输入(以防您不想在模板中添加 token 标签)。

关于javascript - Django 的 CSRF 验证失败,尽管 Firebug 说 cookies 选项卡下有一个 csrftoken。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30407856/

相关文章:

django - 为什么 django 设置不应在运行时更改?

javascript - 像在 JS 中一样处理 Python 异常

Python 切片多个输出

python - 将菜单项添加到 Django 管理站点

java - 用于拍卖网站的框架的性能比较

python - Docker 化 Django 应用程序

javascript - 从 myStrings 命名的接口(interface)属性名称

javascript - 通过jquery显示json数据的值

javascript - 在 IE 中显示长时间运行 for 循环的进度条

javascript - Kendo ui 柱形图标签