django/ajax CSRF令牌丢失
我有下面的ajax函数,当我使用select2控件超过最小长度输入3时,它会给我一个跨站点伪造请求令牌错误。知道这一点后,我尝试将{csrfmiddlewaretoken:{{{csrf_token}}}}添加到我的数据:。在添加csrfmiddlewaretoken之后,我仍然得到CSRF令牌丢失或错误。我相信这和我的searchFilter和searchPage的功能有关。正确的方法是什么django/ajax CSRF令牌丢失,ajax,django,jquery-select2,Ajax,Django,Jquery Select2,我有下面的ajax函数,当我使用select2控件超过最小长度输入3时,它会给我一个跨站点伪造请求令牌错误。知道这一点后,我尝试将{csrfmiddlewaretoken:{{{csrf_token}}}}添加到我的数据:。在添加csrfmiddlewaretoken之后,我仍然得到CSRF令牌丢失或错误。我相信这和我的searchFilter和searchPage的功能有关。正确的方法是什么 // using jQuery function getCookie(name) { var
// 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,
},
};
},
},
});
});
//使用jQuery
函数getCookie(名称){
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i
我的观点还有POST方法和csrf_令牌
{% block content %}
<form action = "{% url 'multiresult' %}" form method = "POST">
{% csrf_token %}
{% block extra_js %}
{{ block.super }}
{{ form.media }}
{%block content%}
{%csrf_令牌%}
{%block extra_js%}
{{block.super}}
{{form.media}
控制台的响应是
禁止(CSRF令牌丢失或不正确。):/search/multisearch/
[29/Mar/2018 09:14:52]“POST/search/multisearch/HTTP/1.1”403 2502刚刚更改了下面的代码行,它更简单,因为您不必涉及模板。您提供的js代码段已经具有csrf值
data: { csrfmiddlewaretoken: '{{ csrf_token }}' },
// INTO
data: { csrfmiddlewaretoken: csrftoken },
您必须将
csrf\u令牌
作为标题:
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
//example ajax
$.ajax({
url: url,
type: 'POST',
headers:{
"X-CSRFToken": csrftoken
},
data: data,
cache: true,
});
如果您不在ssl上,请确保CSRF\u COOKIE\u安全
=False
。
如果使用ssl,请将其设置为True
是否为CSRF cookie使用安全cookie。如果设置为True,cookie将被标记为“安全”,这意味着浏览器可以确保cookie仅通过HTTPS连接发送
JS和Django模板语言的混合帮助解决了这个问题
$.ajax({
type: 'POST',
headers:{
"X-CSRFToken": '{{ csrf_token }}'
}
})
Django文档解释了如何设置标题。由于您的ajax请求提交json编码的数据,所以必须使用这种方法。我已经按照您的建议做了,但仍然遇到403错误的问题。我已经添加了上面的更改。另外,一旦select2控件中的最小长度输入值达到3,就会发生403错误。我是否会将CSRF\u COOKIE\u SECURE添加到我的settings.py中?我没有使用SSL。是的,将它添加到设置中。我按照您的建议做了,它更正了我的CSRF错误。我的结果是另一个问题,谢谢你给我指引了正确的方向。没问题:)我很高兴我能帮上忙