在前一篇的知识储备下,开始接受AJAX
的的洗礼吧。javascript
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。html
即便用Javascript语言与服务器进行异步交互,传输的数据为XML(固然,传输的数据不仅是XML)。java
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。python
注意,接下来才是重点!!!jquery
举个栗子:ajax
咱们常常会在网站搜图片或者看文章,当你不断下拉的时候,拉到页面底部,突然!网页又加载出来一堆图片和文章,这种状况,其实就是咱们的AJAX在干活,是否是内心有点数了?django
第一,AJAX 最大的优势:编程
第二,AJAX工做原理:json
不须要任何浏览器插件,但须要用户容许JavaScript在浏览器上执行。后端
有人会问,图片中的“XHR”是什么东西,别急,咱们慢慢来。
所谓的“XHR”(浏览器内置对象”XMLHttpRequest ”),也就是Ajax功能实现所依赖的对象,AJAX就是经过浏览器的内置对象XHMHttpResquest
来发送异步请求的,异步请求不会妨碍客户端的任何操做。
XHR至关因而一个通讯兵,来负责客户端与服务器之间的通讯传输。
举个形象生动的例子:
要打仗了,前方阵地(客服端)不可能只等着通讯兵(XHR)传递消息其余什么也不干吧,因此前方阵地还在干着本身的事情而后派通讯兵去请求后方指挥部(服务器)的命令,指挥部下达命令指挥,通讯兵再把命令传到前方阵地,而后前方阵地再执行命令相关的操做(客户端把数据渲染到页面),这也就是Ajax的异步原理。
所谓的同步就是前方阵地和通讯兵一块儿去向服务器请求数据,直到通讯兵请求到数据,我才开始渲染页面,在请求的过程当中页面一直是白屏等待的。
等一下,这个同步异步你们有没有回想起咱们以前在学习线程进程的时候,也有同步异步。
其实说得简单点,就是你在烧水,同步就是你啥也不干就等水开,异步则是水壶一丢去干别的事了。
页面输入两个整数,经过AJAX传输到后端计算出结果并返回。
#HTML部分代码# <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <input type="text" id="i1"> + <input type="text" id="i2"> = <input type="text" id="i3"> <button id="b1">Ajax Test</button> <script src="/static/jquery-3.3.1.min.js"></script> <script> $('#b1').click(function () { $.ajax({ url:'', type:'POST', data:{i1:$('#i1').val(),i2:$('#i2').val()}, success:function (data) { $('#i3').val(data) } }) }) </script> </body> </html>
#views.py def ajax_test(request): if request.method=='POST': i1=request.POST.get('i1') i2=request.POST.get('i2') ret=int(i1)+int(i2) return HttpResponse(ret) return render(request,'ajax_test.html') views.py
#urls.py from django.conf.urls import url from app01 import views urlpatterns=[ url(r'^ajax_test/',views.ajax_test), ]
其实除了上文提到的页面加载用到的AJAX技术,还有一些常见的例子:
当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,而后服务器会把查询到的结果响应给浏览器,最后再把后端返回的结果展现出来。
具体步骤:
当输入用户名后,把光标移动到其余表单项上时
浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为lemontree7777777的用户是否存在
最终服务器返回true表示名为lemontree7777777的用户已经存在
浏览器在获得结果后显示“用户名已被注册!”
整个过程当中页面没有刷新,只是局部刷新了
在请求发出后,浏览器不用等待服务器响应结果就能够进行其余操做
AJAX干掉了Back和History功能,即对浏览器机制的破坏。
安全问题技术同时也对IT企业带来了新的安全威胁。
对搜索引擎的支持比较弱。若是使用不当,AJAX会增大网络数据的流量,从而下降整个系统的性能。
这缺点也太长了!!!!你们只须要记住AJAX的局部刷新优势就行,缺点在优势面前就显得...你懂的!
最基本的jQuery发送AJAX请求示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> .hide { display: none; } </style> </head> <body> <p> <input type="text" class="user"> <span class="hide" style="color: red">用户名已存在</span> </p> <script src="/static/jquery-3.3.1.min.js"></script> {#下面这一项是基于jQuery的基础上自动给咱们的每个ajax绑定一个请求头信息,相似于form表单提交post数据必需要有的csrf_token同样#} {#不然个人Django中间件里面的校验csrf_token那一项会认为你这个请求不是合法的,阻止你的请求#} <script src="/static/setup_Ajax.js"></script> <script> //给input框绑定一个失去焦点的事件 $('.user').blur(function () { //$.ajax为固定用法,表示启用ajax $.ajax({ //url后面跟的是你这个ajax提交数据的路径,向谁提交,不写就是向当前路径提交 url:'', //type为标定你这个ajax请求的方法 type:'POST', //data后面跟的就是你提交给后端的数据 data:{'username':$(this).val()}, //success为回调函数,参数data即后端给你返回的数据 success:function (data) { ret=JSON.parse(data); if (ret['flag']){ $('p>span').removeClass('hide'); } } }) }); </script> </body> </html>
def index(request): if request.method=='POST': ret={'flag':False} username=request.POST.get('username') if username=='JBY': ret['flag']=True import json return HttpResponse(json.dumps(ret)) return render(request,'index.html')
data参数中的键值对,若是值不为字符串,须要将其转换成字符串类型。
$("#b1").on("click", function () { $.ajax({ url:"/ajax_add/", type:"GET", data:{"i1":$("#i1").val(),"i2":$("#i2").val(),"hehe": JSON.stringify([1, 2, 3])}, success:function (data) { $("#i3").val(data);kkk } }) })
var b2 = document.getElementById("b2"); b2.onclick = function () { // 原生JS var xmlHttp = new XMLHttpRequest(); xmlHttp.open("POST", "/ajax_test/", true); xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlHttp.send("username=q1mi&password=123456"); xmlHttp.onreadystatechange = function () { if (xmlHttp.readyState === 4 && xmlHttp.status === 200) { alert(xmlHttp.responseText); } }; };
csrf_token
不管是ajax
仍是谁,只要是向我Django
提交post
请求的数据,都必须校验csrf_token
来防伪跨站请求。
那么如何在个人ajax
中弄这个csrf_token
呢???
我又不像form
表单那样能够在表单内部经过一句{% csrf_token %}
就搞定了......
经过获取隐藏的input标签中的csrfmiddlewaretoken
值,放置在data中发送。
$.ajax({ url: "/cookie_ajax/", type: "POST", data: { "username": "Tonny", "password": 123456, "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val() // 使用JQuery取出csrfmiddlewaretoken的值,拼接到data中 }, success: function (data) { console.log(data); } })
经过获取返回的cookie
中的字符串,放置在请求头中发送。
注意:须要引入一个jquery.cookie.js插件。
$.ajax({ url: "/cookie_ajax/", type: "POST", headers: {"X-CSRFToken": $.cookie('csrftoken')}, // 从Cookie取csrf_token,并设置ajax请求头 data: {"username": "Ada", "password": 123456}, success: function (data) { console.log(data); } })
或者用本身写一个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');
每一次都这么写太麻烦了,可使用$.ajaxSetup()方法为ajax请求统一设置。
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", csrftoken); } } });
将下面的文件配置到你的Django项目的静态文件中,在html页面上经过导入该文件便可自动帮咱们解决ajax提交post数据时校验csrf_token的问题。
(导入该配置文件以前,须要先导入jQuery,由于这个配置文件内的内容是基于jQuery来实现的)
太多啦,重要的“Ajax传Json格式数据”、“Ajax上传文件”部分,下篇见:)