Day 50 Ajax
一、Ajax简介
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
- 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
优点:
- AJAX使用Javascript技术向服务器发送异步请求
- AJAX无须刷新整个页面
二、jQuery实现Ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <a href="/get_OK/">点击</a><span class="error"></span> <hr> <p>姓名<input type="text"></p> <p>密码<input type="password"></p> <p><button class="Ajax_send">Ajax_send</button><span class="login_error"></span></p> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script> <script> $(".Ajax_send").click(function () { // ajax请求 $.ajax({ url:"/tishi_ajax/", //请求路径 type:"GET", //请求方式 //吧js对象转成json字符串 data:JSON.stringify({ name:$(":text").val(), pwd:$(":password").val() }), // 请求数据 ,是js数据 ?name=yuan&pwd=123 contentType:"application/json", //告诉服务器发的是json的格式 success:function (data) { // 回调函数 var data=JSON.parse(data); //js中的反序列化 console.log(data); console.log(typeof data); // $(".error").html(data) if(!data["flag"]){ //为False的情况 $(".login_error").html("用户名或者密码错误") } } }) }) </script> </body> </html>
三、Ajax案例
1、用户名是否已被注册
在注册表单中,当用户填写了用户名后,把光标移开后,会自动向服务器发送异步请求。服务器返回true或false,返回true表示这个用户名已经被注册过,返回false表示没有注册过。客户端得到服务器返回的结果后,确定是否在用户名文本框后显示“用户名已被注册”的错误信息!
2、基于Ajax进行登录验证
用户在表单输入用户名与密码,通过Ajax提交给服务器,服务器验证后返回响应信息,客户端通过响应信息确定是否登录成功,成功,则跳转到首页,否则,在页面上显示相应的错误信息。
四、Ajax实现一个计算案例
<script> $("#b1").click(function () { let val1 = $(".i1").val(); let val2 = $(".i2").val(); $.ajax({ url: "{% url 'ajax_t' 0 %}".replace(/0/, val1), # 带参数 反向解析 url type: "POST", data: { num1:val1, num2: val2, csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(), # csrf 跨站请求伪造 }, success:function (data) { if(data.status){ $(".i3").val(data.total) }else{ $(".sp").text(data.msg); setTimeout(function () { // 1s后去掉提示信息 $(".sp").html("") },1000) } } }) }) </script>
五、基于Ajax上传json数据
1、模板文件
<script> $(".jbtn").click(function () { $.ajax({ url:'/put/', type: "POST", contentType: "json", headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()}, // 在请求头中添加csrf data: JSON.stringify({ a:12, b:23, user: "alex", }), success:function (data) { console.log(data) } }) }) </script>
2、视图函数
def put(request): print(request.POST) print(request.body) import json data = json.loads(request.body.decode("utf8")) print(data, type(data)) return HttpResponse("OK")
六、基于form表单上传文件
文件和其他的数据类型不一样,是一个二进制的形式
Form上传文件的时候切记要加上:enctype="multipart/form-data"
1、模板文件
<form action="/upload_file/" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file_name"> <input type="submit"> </form>
2、视图函数
视图函数里面要用
request.FILES.get('file_name')
def upload_file(request): if request.method == "POST": file_obj = request.FILES.get('file_name') name = file_obj.name with open(os.path.join("media", name), "wb") as f: for i in file_obj: f.write(i) return HttpResponse('上传成功') return render(request, "index.html")
七、基于Ajax请求上传文件
关键点:
1. new FormData()
2.processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
3.注意:下文中的几个需要解释的
$("#upload") 拿到的是一个集合 $("#upload")[0] 就是一个dom对象 $("#upload")[0].files 拿到的是一个filelist $("#upload")[0].files[0] 拿到的是当前最近的文件对象
1、模板文件
<script> $(".btn_sub").click(function () { let formdata = new FormData(); formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val()); formdata.append('file_name', $(".file_name")[0].files[0]); $.ajax({ url: "/upload_file/", type: "POST", processData: false, // 告诉jQuery不要去处理发送的数据 contentType: false, // 告诉jQuery不要去设置Content-Type请求头 data: formdata, success:function (data) { console.log(data) } }) }) </script>
2.视图函数
def upload_file(request): if request.method == "POST": file_obj = request.FILES.get('file_name') name = file_obj.name with open(os.path.join("media", name), "wb") as f: for i in file_obj: f.write(i) return HttpResponse('上传成功') return render(request, "index.html")
补充:
一、csrf跨站请求伪造
如果把type:"GET" 改为type:"POST" 会报一个Forbidden的错
解决办法有三种:
方式一:
$.ajaxSetup({ data:{csrfmiddlewaretoken:'{{ csrf_token }}'} }); 注意:要放在ajax请求的前面,在发送之前组装一组字符串,在第一步render的时候就发了 所以有局限性: 如果把JS代码放到静态文件中,不会渲染,不会执行{{csrf_token}},只能在HTML页面中使用
方式二:自己组装一组键值对 ( 推荐):
<form> {% csrf_token %} </form> data:{ csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(), name:$(":text").val(), pwd:$(":password").val() },
方式三:自己设置头信息:
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script> $.ajax({ url:"/serialize/", type:"POST", headers:{"X-CSRFToken":$.cookie('csrftoken')}, })
二、ajax参数补充
1.请求参数
######################------------data---------################ data: 当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式 (urlencoded:?a=1&b=2)发送给服务端;此外,ajax默认以get方式发送请求。 function testData() { $.ajax("/test",{ //此时的data是一个json形式的对象 data:{ a:1, b:2 } }); //?a=1&b=2 ######################------------processData---------################ processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;if为false, 那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString() ,最后得到一个[object,Object]形式的结果。 ######################------------contentType---------################ contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。 用来指明当前请求的数据编码格式;urlencoded:?a=1&b=2;如果想以其他方式提交数据, 比如contentType:"application/json",即向服务器发送一个json字符串: $.ajax("/ajax_get",{ data:JSON.stringify({ a:22, b:33 }), contentType:"application/json", type:"POST", }); //{a: 22, b: 33} 注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象 ######################------------traditional---------################ traditional:一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]}, traditional为false会对数据进行深层次迭代;
2.响应参数
/*
dataType: 预期服务器返回的数据类型,服务器端返回的数据会根据这个值解析后,传递给回调函数。
默认不需要显性指定这个属性,ajax会根据服务器返回的content Type来进行转换;
比如我们的服务器响应的content Type为json格式,这时ajax方法就会对响应的内容
进行一个json格式的转换,if转换成功,我们在success的回调函数里就会得到一个json格式
的对象;转换失败就会触发error这个回调函数。如果我们明确地指定目标类型,就可以使用
data Type。
dataType的可用值:html|xml|json|text|script
见下dataType实例
*/
- type不写的话默认是GET
- dataType和ContentType:
dataType: 浏览器发给服务器希望返回的数据类型 。。如果我们明确地指定目标类型,就可以使用data Type。
ContentType:
请求头里有:浏览器告诉服务器内容的类型
响应头里也有:服务器响应浏览器的内容
3.JS和JQuery对象之间的转换
jQuery对象加[0]就转换成了dom对象
dom对象加$符就转换成了jquery对象

浙公网安备 33010602011771号