use*_*034 2 django ajax jquery-select2
我有以下 ajax 函数,一旦我使用 select2 控件超过 3 的 minimumlengthinput ,它就会给我一个跨站点伪造请求令牌错误。知道这一点后,我尝试将 { csrfmiddlewaretoken: '{{ csrf_token }}' }, 添加到我的数据中:。添加 csrfmiddlewaretoken 后,我仍然收到 CSRF 令牌丢失或不正确的错误。我相信这与我的 searchFilter 和 searchPage 函数有关。这样做的正确方法是什么?
// using jQuery
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');
$(document).ready(function () {
$('.selectuserlist').select2({
minimumInputLength: 3,
allowClear: true,
placeholder: {
id: -1,
text: 'Enter the 3-4 user id.',
},
ajax: {
type: 'POST',
url: '',
contentType: 'application/json; charset=utf-8',
async: false,
dataType: 'json',
data: { csrfmiddlewaretoken: csrftoken },
function(params) {
return "{'searchFilter':'" + (params.term || '') + "','searchPage':'" + (params.page || 1) + "'}";
},
processResults: function (res, params) {
var jsonData = JSON.parse(res.d);
params.page = params.page || 1;
var data = { more: (jsonData[0] != undefined ? jsonData[0].MoreStatus : false), results: [] }, i;
for (i = 0; i < jsonData.length; i++) {
data.results.push({ id: jsonData[i].ID, text: jsonData[i].Value });
}
return {
results: data.results,
pagination: { more: data.more,
},
};
},
},
});
});
Run Code Online (Sandbox Code Playgroud)
我的视图也有 POST 方法和 csrf_token。
{% block content %}
<form action = "{% url 'multiresult' %}" form method = "POST">
{% csrf_token %}
{% block extra_js %}
{{ block.super }}
{{ form.media }}
Run Code Online (Sandbox Code Playgroud)
控制台的响应是
禁止(CSRF 令牌丢失或不正确。):/search/multisearch/ [29/Mar/2018 09:14:52] "POST /search/multisearch/ HTTP/1.1" 403 2502
Kin*_*oad 11
您必须包含csrf_tokenas 标题:
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
//example ajax
$.ajax({
url: url,
type: 'POST',
headers:{
"X-CSRFToken": csrftoken
},
data: data,
cache: true,
});
Run Code Online (Sandbox Code Playgroud)
还要确保CSRF_COOKIE_SECURE=False如果您不在 ssl 上。如果您使用 ssl,请将其设置为True.
是否为 CSRF cookie 使用安全 cookie。如果设置为 True,cookie 将被标记为“安全”,这意味着浏览器可以确保 cookie 仅通过 HTTPS 连接发送。
| 归档时间: |
|
| 查看次数: |
7201 次 |
| 最近记录: |