AJAX(Asynchronous Javascript And XML)翻譯成中文就是「異步Javascript和XML」。即便用Javascript語言與服務器進行異步交互,傳輸的數據爲XML(固然,傳輸的數據不僅是XML,如今更多使用json數據)。css
AJAX除了異步的特色外,還有一個就是:瀏覽器頁面局部刷新;(這一特色給用戶的感覺是在不知不覺中完成請求和響應過程)html
<button class="send_Ajax">send_Ajax</button> <script> $(".send_Ajax").click(function(){ $.ajax({ url:"/handle_Ajax/", type:"POST", data:{username:"lewen",password:123}, success:function(data){ console.log(data) }, error: function (jqXHR, textStatus, err) { console.log(arguments); }, complete: function (jqXHR, textStatus) { console.log(textStatus); }, statusCode: { '403': function (jqXHR, textStatus, err) { console.log(arguments); }, '400': function (jqXHR, textStatus, err) { console.log(arguments); } } }) }) </script>
是jquery
$(".login_btn").click(function () { $.ajax({ url: "/login/", type: "post", data: { "user": $("#user").val(), "pwd": $("#pwd").val(), }, success: function (data) { console.log(data); // json字符串 console.log(typeof data); var res = JSON.parse(data);// 反序列化 object {} console.log(res); // object console.log(typeof res); if (data.user) { location.href = "http://127.0.0.1/index" } else { $(".error").html(data.msg).css({"color": "red", "margin-left": "10px"}) } } }) })
視圖處理ajax
def login(request): print(request.POST) user = request.POST.get("user") pwd = request.POST.get("pwd") user = User.objects.filter(name=user, pwd=pwd).first() res = {"user": None, "msg": None} if user: res["user"] = user.name else: res["msg"] = "username or passwor wrong! " import json return HttpResponse(json.dumps(res))
ContentType指的是請求體的編碼類型,常見的類型共有3種:json
這應該是最多見的 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
這又是一個常見的 POST 數據提交的方式。咱們使用表單上傳文件時,必須讓 <form> 表單的 enctype
等於 multipart/form-data。服務器
這種方式通常用來上傳文件,各大服務端語言對它也有着良好的支持。app
上面提到的這兩種 POST 數據的方式,都是瀏覽器原生支持的,並且現階段標準中原生 <form> 表單也只支持這兩種方式(經過 <form> 元素的 enctype
屬性指定,默認爲 application/x-www-form-urlencoded
。其實 enctype
還支持 text/plain
,不過用得很是少)。異步
隨着愈來愈多的 Web 站點,尤爲是 WebApp,所有使用 Ajax 進行數據交互以後,咱們徹底能夠定義新的數據提交方式,給開發帶來更多便利ide
application/json 這個 Content-Type 做爲響應頭你們確定不陌生。實際上,如今愈來愈多的人把它做爲請求頭,用來告訴服務端消息主體是序列化後的 JSON 字符串。因爲 JSON 規範的流行,除了低版本 IE 以外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會趕上什麼麻煩。
JSON 格式支持比鍵值對複雜得多的結構化數據,這一點也頗有用。記得我幾年前作一個項目時,須要提交的數據層次很是深,我就是把數據 JSON 序列化以後來提交的。不過當時我是把 JSON 字符串做爲 val,仍然放在鍵值對裏,以 x-www-form-urlencoded 方式提交。
<form action="" method="post" enctype="multipart/form-data"> 用戶名 <input type="text" name="user"> 頭像 <input type="file" name="avatar"> <input type="submit"> </form>
點擊submit 後瀏覽器就直接提交
def file_put(request): if request.method == "POST": print("body", request.body) # 請求報文中的請求體 print("POST", request.POST) # if contentType==urlencoded ,request.POST纔有數據 print(request.FILES) file_obj = request.FILES.get("avatar") with open(file_obj.name, "wb") as f: for line in file_obj: f.write(line) return HttpResponse("OK") return render(request, "file_put.html")
模板
<form> 用戶名 <input type="text" id="user"> 頭像 <input type="file" id="avatar"> <input type="button" id="ajax-submit" value="ajax-submit"> </form> <script> $("#ajax-submit").click(function(){ var formdata=new FormData(); formdata.append("user",$("#user").val()); formdata.append("avatar",$("#avatar")[0].files[0]); $.ajax({ url:"", type:"post", data:formdata, processData: false , // 不處理數據 contentType: false, // 不設置內容類型 success:function(data){ console.log(data) } }) }) </script>
將上傳的頭像封裝到formdata 裏面
視圖
def file_put(request): if request.method == "POST": print("body", request.body) # 請求報文中的請求體 print("POST", request.POST) # if contentType==urlencoded ,request.POST纔有數據 print(request.FILES) file_obj = request.FILES.get("avatar") with open(file_obj.name, "wb") as f: for line in file_obj: f.write(line) return HttpResponse("OK") return render(request, "file_put.html")
$(".btn").click(function(){ $.ajax({ url:"", type:"post", contentType:"application/json", data:JSON.stringify({ a:1, b:2 }), success:function(data){ console.log(data) } }) });
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script> </head> <body> <h2>this is Index!</h2> <button class="Ajax">Ajax</button> <p class="content"></p> <hr> <input type="text" id="num1">+<input type="text" id="num2">=<input type="text" id="ret"> <button class="cal">計算</button> <hr> <form> 用戶名 <input type="text" id="user"> 密碼 <input type="password" id="pwd"> <input type="button" value="submit" class="login_btn"><span class="error"></span> </form> <script> $(".Ajax").click(function () { //發送Ajax請求 $.ajax({ url: "/test_ajax/", // 請求url type: "get", // 請求方式post data: {a: 1, b: 2}, success: function (data) { // 回調函數 console.log(data); $(".content").html(data) } }) }); // Ajax計算求值 $(".cal").click(function () { $.ajax({ url: "/cal/", type: "post", contentType: "multipart/form-data", data: { "n1": $("#num1").val(), "n2": $("#num2").val(), }, success: function (data) { console.log(data); $("#ret").val(data); } }) }); // 登陸驗證 $(".login_btn").click(function () { $.ajax({ url: "/login/", type: "post", data: { "user": $("#user").val(), "pwd": $("#pwd").val(), }, success: function (data) { console.log(data); // json字符串 console.log(typeof data); var res = JSON.parse(data);// 反序列化 object {} console.log(res); // object console.log(typeof res); if (data.user) { location.href = "http://127.0.0.1/index" } else { $(".error").html(data.msg).css({"color": "red", "margin-left": "10px"}) } } }) }) </script> </body> </html>