一、
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。
即使用Javascript语言与服务器进行异步交互,传输数据。传输的数据不只是XML。
特点优势:
1. AJAX使用JavaScript技术向服务器发送异步请求
2. AJAX请求无须刷新整个页面,即可与服务器交换数据并更新部分网页内容
3. 因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高
即(异步不等待)(局部刷新)(高性能)
ajax 的使用:
$.ajax( { } ) 参数如下
$.ajax({
url: "/calc/", // 给谁发请求
type: "post", // 请求的方法
data: {"name": "Alex", "age": 35}, // 数据
success:function(res){ // 请求被成功响应之后会做的事儿
console.log(res)
},
error:function(err){
console.log(err) // 请求发生错误时会做的事儿
}
})
data中的对象不能发生嵌套,要做处理
data: {
"name": "alex",
"hobby": JSON.stringify(["抽烟", "喝酒", "吹牛逼"]),
},
原生JS 发 ajax:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 var b2 = document.getElementById("b2"); 2 b2.onclick = function () { 3 // 原生JS 4 var xmlHttp = new XMLHttpRequest(); 5 xmlHttp.open("POST", "/ajax_test/", true); 6 xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 7 xmlHttp.send("username=q1mi&password=123456"); 8 xmlHttp.onreadystatechange = function () { 9 if (xmlHttp.readyState === 4 && xmlHttp.status === 200) { 10 alert(xmlHttp.responseText); 11 } 12 }; 13 };
二、解决csrf_token方法
关键点是request请求中,必须要有 token随机字符串
方法1: 在ajax请求的传送数据(data)中设置 csrfmiddlewaretoken 值。
方法2: 在ajax请求头(headers)中设置 X-CSRFToken 值。
注意:可以使用 $.ajaxSetup( ) 方法为ajax请求统一设置。
关于获取token随机字符串的方法:
方法1:渲染页面中加 {% csrf_token %} ,通过属性选择器$("[name='csrfmiddlewaretoken']").val()取值。
在前段渲染出一个隐藏的input标签,有属性name="csrfmiddlewaretoken",值就是token随机字符串
(所以表单中加{%csrf_token%},提交数据时,会将token随机字符串以键值对的形式一并提交)
方法2: 通过获取页面渲染时返回的cookie中的csrftoken的value值,就是所需token随机字符串。
形式1:
注意:需要引入一个jquery.cookie.js插件。
$.ajax({
url: "/cookie_ajax/",
type: "POST",
// 从Cookie取csrftoken,并设置到请求头中
headers: {"X-CSRFToken": $.cookie('csrftoken')},
data: {"username": "Q1mi", "password": 123456},
success: function (data) {
console.log(data);
}
})
形式2:
不引插件,自己写一个getCookie 方法,从Cookie中取csrftoken值
js静态文件中:
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');
JS中:
headers: {"X-CSRFToken": csrftoken}, // 从Cookie取csrftoken,并设置到请求头中
最终,解决csrf_token问题
官方推荐方法(插件版):
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
}
}
});
ok