AJAX(Asynchronous Javascript And XML),翻译成中文为"异步Javascript和XML"。即便用Javascript语言与服务器进行异步交互,传输的数据为XML(固然,传输的数据不仅是XML,如今更多使用json数据)html
同步交互:客户端发出一个请求后,须要等待服务器响应结束后,才能发出第二个请求
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就能够发出第二个请求
Ajax特色:jquery
场景:ajax
$(".class").click(function(){ 绑定事件 $.ajax({ url:"", type:"GET/post", data: { a:1, b:2, } success: function(res){ 响应处理 } }) })
Python中引入JsonResponse:chrome
from django.http import JsonResponse
Javascript中自定义对象({ })与json字符串的转换:django
# <1> 自定义对象转换成json字符串: JSON.stringify() # <2> json字符串转换成自定义对象: 变量名.parse()
contentType为json的基于Ajax请求:json
<input type="button" class="ajax-btn" value="submit_json"> <script> $('.ajax_btn').click(function(){ $.ajax({ url:'/put1/', type:'post', contentType:'json', data:JSON.stringify({ a:1, b:2 }), success:function(res){ 响应处理 } }) }) </script>
ContentType指的是请求体的编码的类型,常见的类型共有3种:浏览器
这是最多见的POST提交数据的方式。浏览器的原生<form>表单,如里不设置enctype属性,那么最终就会以application/x-www-form-urlencoded方式提交数据。请求相似于下面这样(无关的请求头在本文中都省略掉了):服务器
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 user=Ethan&age=22
这是一常见的POST数据提交方式。在使用表单上传文件时,必须让<form>表单的enctype等于multipart/form-data。app
这种方式通常用来上传文件,各大服务端语言对它也有着良好的支持异步
看以下请求示例:
POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="user" Ethan ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
这个例子稍微复杂点:
关于multipart/form-data详细定义,可参考rfc 1867
以上提到的两种POST数据的方式,都是浏览器原生支持的,并且现阶段标准中原生<form>表单也只支持这两种方式(经过<form>元素的enctype属性指定,默认为application/x-www-form-urlencoded。其实还支持text/plain,不过用得很是少)
如今愈来愈多的人把application/json做为请求头,用来告诉服务端消息主体是序列化后的JSON字符串。因为JSON规范的流行,除了低版本IE以外的各大浏览器都原生支持JSON.stringify,服务端语言也都有处理JSON的函数,使用JSON不会赶上什么麻烦。JSON格式支持比键值对复杂的多的结构化数据。
<form action="/put/", method="post", enctype="multipart/form-data"> {% csrf_token %} <input type="text" name="user"> <input type="file" name="file"> <input type="submit"> </form>
def put(request): file_obj = request.FILES.get("file") name = file_obj.name with open("", "wb") as f_w: for line in file_obj: f_w.write(line) return HttpResponse("上传成功")
<div> {% csrf_taken %} <input type="text" class="user"> <input type="file" class="file"> <input type="button" value="submit" class="ajax_btn"> </div> <script> $(".ajax_btn").click(function(){ let formdata = new FormData(); formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val()) formdata.append("user", $(".user").val()); formdata.append("file", $(".file")[0].files[0]); $.ajax({ url: "/put/", type: "post", contentType: false, // 不设置内容类型 processData: false, // 不处理数据 data: formdata, success: function(res){ 响应内容 } }) }) </script>
在注册表单中,当用户填写了用户名后,把光标移开后,会自动向服务器发送异步请求。服务器返回true或false,返回true表示这个用户名已被注册过,返回false表示没有注册过。客户端获得服务器返回的结果后,肯定是否在用户名文本框后显示"用户名已被注册"的错误信息。
用户在表单输入用户名与密码,经过Ajax提交给服务器,服务器验证后返回响应信息,客户端经过响应信息肯定是否登陆成功,成功,则跳转到首页,不然,在页面上显示相应的错误信息。