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

2024-10-03 23:27:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我遵循了StackOverflow上推荐的很多东西,但都没有用。我还尝试在不同的地方压缩html中的{%csrf\u 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);
        }
    });
});

然后调用视图.py地址:

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')

Tags: inidforinputdatasavetypefunction
1条回答
网友
1楼 · 发布于 2024-10-03 23:27:22

根据django docs,您可以将令牌作为请求的头将其添加为有效负载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是从中读取令牌的备用位置,而不是输入(以防您不想在模板中添加令牌标记)。你知道吗

相关问题 更多 >