django中使用ajax请求响应,如果后使用的是视图方法最简单的是用在方法前引用@csrf_exempt装饰器就行了,但是如果我们使用的是视图类总是报
path('farmer/taskdelete/',TaskDeleteFarmerView.as_view(),name='taskdelete_framer')AttributeError: 'function' object has no attribute 'as_view'
在ajax请求提交csrfToken则会解决这个问题最简单的就是在ajax请求前加上
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}'},
});
第二种方式:
从获取当前页面的get请求的响应中cookie里获取csrfToken,再写入当前post请求的请求头中;
需要引入:jquery.cookie.js插件
<script> $.ajax({
url: "/ajax_res/",
type: "post",headers: {"X-CSRFToken":$.cookie("csrftoken")},data: {"name": name}
success: function(args){
alert(args)
//... }
});</script>
或者用自己写一个getCookie方法:
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');
第三种方法:
django模板标签提供{% csrf_token %}在前端生成input框,如果在settings.py文件中开启了该中间件,每次post请求就需要提交django自动生成的csrfToken;
将{% csrf_token %}生成的input框的value通过ajax传参来提交;
{% csrf_token %}<!-- django模板标签提供的csrf_token值,会自动生成一个input框--><script> $("#button_name").on("click",function{
var name = $("#name").val();
var csrfToken = $("[name="csrfmiddlewaretoken"]").val();$.ajax({ url:"/ajax_res/", // 请求视图 type: "post", // 请求方式// 携带数据,从{% csrf_token %}input框中获取csrfToken值,通过ajax方式提交后台,否则报错:Forbidden(CSRF token missing or incorrect.) data: {"name": name, "csrfmiddlewaretoken": csrfToken} success:function(args){
alert(args) // 返回数据//... }
});
});</script>