Django 的 CSRF 验证失败,尽管 Firebug 说 cookies 选项卡下有一个 csrftoken。为什么?
CSRF verification failed for Django despite Firebug saying there is a csrftoken underneath cookies tab. Why?
我遵循了 Whosebug 上推荐的很多内容,但无济于事。我还尝试在各个地方的 html 中挤入 {% csrf_token %},但 none 似乎有效。有什么建议么?这是我的 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 中调用此视图:
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 文档,您可以将令牌作为请求的 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 是从中读取令牌的替代位置,而不是输入(以防您不想在模板中添加令牌标签)。
我遵循了 Whosebug 上推荐的很多内容,但无济于事。我还尝试在各个地方的 html 中挤入 {% csrf_token %},但 none 似乎有效。有什么建议么?这是我的 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 中调用此视图:
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 文档,您可以将令牌作为请求的 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 是从中读取令牌的替代位置,而不是输入(以防您不想在模板中添加令牌标签)。