码迷,mamicode.com
首页 > 编程语言 > 详细

Python 20 Ajax全套

时间:2018-01-30 23:05:42      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:put   element   pwd   介绍   cli   async   data   过程   inf   

概述

对于web应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上。  

1、传统的Web应用

一个简单操作需要重新加载全局数据

2、AJAX

AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案。

  • 异步的JavaScript:
    使用 【JavaScript语言】 以及 相关【浏览器提供类库】 的功能向服务端发送请求,当服务端处理完请求之后,【自动执行某个JavaScript的回调函数】。
    PS:以上请求和响应的整个过程是【偷偷】进行的,页面上无任何感知。
  • XML
    XML是一种标记语言,是Ajax在和后台交互时传输数据的格式之一

利用AJAX可以做:
1、注册时,输入用户名自动检测用户是否已经存在。
2、登陆时,提示用户名密码错误
3、删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除。(博客园)

 

原生AJAX

Ajax主要就是使用 【XmlHttpRequest】对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件)。

1、XmlHttpRequest对象介绍

XmlHttpRequest对象的主要方法:

技术分享图片
 1 a. void open(String method,String url,Boolen async)
 2    用于创建请求
 3     
 4    参数:
 5        method: 请求方式(字符串类型),如:POST、GET、DELETE...
 6        url:    要请求的地址(字符串类型)
 7        async:  是否异步(布尔类型)
 8  
 9 b. void send(String body)
10     用于发送请求
11  
12     参数:
13         body: 要发送的数据(字符串类型)
14  
15 c. void setRequestHeader(String header,String value)
16     用于设置请求头
17  
18     参数:
19         header: 请求头的key(字符串类型)
20         vlaue:  请求头的value(字符串类型)
21  
22 d. String getAllResponseHeaders()
23     获取所有响应头
24  
25     返回值:
26         响应头数据(字符串类型)
27  
28 e. String getResponseHeader(String header)
29     获取响应头中指定header的值
30  
31     参数:
32         header: 响应头的key(字符串类型)
33  
34     返回值:
35         响应头中指定的header对应的值
36  
37 f. void abort()
38  
39     终止请求
View Code

XmlHttpRequest对象的主要属性:

技术分享图片
 1 a. Number readyState
 2    状态值(整数)
 3  
 4    详细:
 5       0-未初始化,尚未调用open()方法;
 6       1-启动,调用了open()方法,未调用send()方法;
 7       2-发送,已经调用了send()方法,未接收到响应;
 8       3-接收,已经接收到部分响应数据;
 9       4-完成,已经接收到全部响应数据;
10  
11 b. Function onreadystatechange
12    当readyState的值改变时自动触发执行其对应的函数(回调函数)
13  
14 c. String responseText
15    服务器返回的数据(字符串类型)
16  
17 d. XmlDocument responseXML
18    服务器返回的数据(Xml对象)
19  
20 e. Number states
21    状态码(整数),如:200、404...
22  
23 f. String statesText
24    状态文本(字符串),如:OK、NotFound...
View Code

 

2、跨浏览器支持

a、XmlHttpRequest

IE7+, Firefox, Chrome, Opera, etc.

b、ActiveXObject("Microsoft.XMLHTTP")

IE6, IE5

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <input type="button" onclick="ajax1()" value="提交" />
 9     <script>
10         // 判断浏览器的对象的方法,可能是XMLHttpRequest,或者是ActiveXObject
11         function GetXHR() {
12             var xhr = null;
13             if (XMLHttpRequest){
14                 xhr = new XMLHttpRequest();
15             }else {
16                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
17             }
18             return xhr;
19         }
20         //get类型
21 {#        function ajax1() {#}
22 {#            var xhr = new XMLHttpRequest();#}
23 {#            xhr.open("GET", "/ajax1/", true);#}
24 {#            xhr.onreadystatechange = function() {#}
25 {#                if(xhr.readyState == 4){#}
26 {#                    //接收完毕#}
27 {#                    var obj = JSON.parse(xhr.responseText);#}
28 {#                    console.log(obj);#}
29 {#                }#}
30 {#            };#}
31 {#            xhr.setRequestHeader(key, value);#}
32 {#            xhr.send(name=dandy;pwd=123)#}
33 {#        }#}
34 
35         //改成post发送
36         function ajax1() {
37             var xhr = GetXHR();
38             xhr.open("POST", "/ajax1/", true);
39             xhr.onreadystatechange = function() {
40                 if(xhr.readyState == 4){
41                     //接收完毕
42                     var obj = JSON.parse(xhr.responseText);
43                     console.log(obj);
44                 }
45             };
46             xhr.setRequestHeader(key, value);
47             xhr.setRequestHeader(Content-Type, application/x-www-form-urlencoded; charset-UTF-8);  // post的时候的文件头
48             xhr.send(name=dandy;pwd=123)  // 发送数据的格式。
49         }
50     </script>
51 </body>
52 </html>
View Code

在Django里面还是将csrf注释掉,因为楼主没写文件头的csrf_token。post的时候还需要设置一下格式Content-Type之类。

JQuery Ajax

jQuery其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能。

  • jQuery 不是生产者,而是大自然搬运工。
  • jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject 

注:2.+版本不再支持IE9以下的浏览器

技术分享图片
 1 jQuery.get(...)
 2                 所有参数:
 3                      url: 待载入页面的URL地址
 4                     data: 待发送 Key/value 参数。
 5                  success: 载入成功时回调函数。
 6                 dataType: 返回内容格式,xml, json,  script, text, html
 7 
 8 
 9             jQuery.post(...)
10                 所有参数:
11                      url: 待载入页面的URL地址
12                     data: 待发送 Key/value 参数
13                  success: 载入成功时回调函数
14                 dataType: 返回内容格式,xml, json,  script, text, html
15 
16 
17             jQuery.getJSON(...)
18                 所有参数:
19                      url: 待载入页面的URL地址
20                     data: 待发送 Key/value 参数。
21                  success: 载入成功时回调函数。
22 
23 
24             jQuery.getScript(...)
25                 所有参数:
26                      url: 待载入页面的URL地址
27                     data: 待发送 Key/value 参数。
28                  success: 载入成功时回调函数。
29 
30 
31             jQuery.ajax(...)
32 
33                 部分参数:
34 
35                         url:请求地址
36                        type:请求方式,GET、POST(1.9.0之后用method)
37                     headers:请求头
38                        data:要发送的数据
39                 contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
40                       async:是否异步
41                     timeout:设置请求超时时间(毫秒)
42 
43                  beforeSend:发送请求前执行的函数(全局)
44                    complete:完成之后执行的回调函数(全局)
45                     success:成功之后执行的回调函数(全局)
46                       error:失败之后执行的回调函数(全局)
47                 
48 
49                     accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
50                    dataType:将服务器端返回的数据转换成指定类型
51                                    "xml": 将服务器端返回的内容转换成xml格式
52                                   "text": 将服务器端返回的内容转换成普通文本格式
53                                   "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
54                                 "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
55                                   "json": 将服务器端返回的内容转换成相应的JavaScript对象
56                                  "jsonp": JSONP 格式
57                                           使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
58 
59                                   如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string
60 
61                  converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数
62                          $.ajax({
63                               accepts: {
64                                 mycustomtype: ‘application/x-some-custom-type‘
65                               },
66                               
67                               // Expect a `mycustomtype` back from server
68                               dataType: ‘mycustomtype‘
69 
70                               // Instructions for how to deserialize a `mycustomtype`
71                               converters: {
72                                 ‘text mycustomtype‘: function(result) {
73                                   // Do Stuff
74                                   return newresult;
75                                 }
76                               },
77                             });
jQuery Ajax 方法列表

 

“伪”AJAX

由于HTML标签的iframe标签具有局部加载内容的特性,所以可以使用其来伪造Ajax请求。

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <input type="button" onclick="ajax1()" value="提交" />
 9     <input type="text" id="urls" />
10     <input type="button" value="iframe提交" id="btn" />
11     <iframe src="http://www.baidu.com" id="ifrm"></iframe>
12     <script src="/static/jquery-3.2.1.js"></script>
13     <script>
14         function GetXHR() {
15             var xhr = null;
16             if (XMLHttpRequest){
17                 xhr = new XMLHttpRequest();
18             }else {
19                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
20             }
21             return xhr;
22         }
23 {#        function ajax1() {#}
24 {#            var xhr = new XMLHttpRequest();#}
25 {#            xhr.open("GET", "/ajax1/", true);#}
26 {#            xhr.onreadystatechange = function() {#}
27 {#                if(xhr.readyState == 4){#}
28 {#                    //接收完毕#}
29 {#                    var obj = JSON.parse(xhr.responseText);#}
30 {#                    console.log(obj);#}
31 {#                }#}
32 {#            };#}
33 {#            xhr.setRequestHeader(key, value);#}
34 {#            xhr.send(name=dandy;pwd=123)#}
35 {#        }#}
36         //改成post发送
37         function ajax1() {
38             var xhr = GetXHR();
39             xhr.open("POST", "/ajax1/", true);
40             xhr.onreadystatechange = function() {
41                 if(xhr.readyState == 4){
42                     //接收完毕
43                     var obj = JSON.parse(xhr.responseText);
44                     console.log(obj);
45                 }
46             };
47             xhr.setRequestHeader(key, value);
48             xhr.setRequestHeader(Content-Type, application/x-www-form-urlencoded; charset-UTF-8);
49             xhr.send(name=dandy;pwd=123)
50         }
51         $(#btn).click(function() {
52             var urls1 = $(#urls).val();
53             console.log(urls1);
54             $(#ifrm).attr(src,urls1)
55         })
56     </script>
57 </body>
58 </html>
View Code

利用前面的实例,我们继续加上一个iframe标签,然后给一个事件改编iframe内部的src的内容。借助了jquery,给iframe的src重新赋值,发现页面框架也没用刷新。这就相当于iframe也有一个伪ajax,给后台发送请求,并异步刷新了。

讲到这里,是不是可以利用iframe的伪造ajax的原理做点其他事。下面就用iframe做一个异步的form提交。

技术分享图片
1     <form action="/ajax1/" method="post" target="iframe1">
2         <iframe name="iframe1"></iframe>
3         <input type="text" name="username" />
4         <input type="submit" value="Form提交" />
5     </form>
iframe form demo

target指向了iframe的name。

技术分享图片

总结一下普通的数据提交的推荐优先级:

1、ajax     2、原生的xhr     3、iframe

 

文件传输

a、XMLHttpRequest:

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display: inline-block;
 9             padding: 5px;
10             background-color: #d0e9c6;
11             text-align: center;
12             line-height: 30px;
13         }
14         .div1{
15             position: relative;
16             width: 100px;
17             height: 50px;
18         }
19         #fafa{
20             position: absolute;
21             top:0;
22             bottom:0;
23             left:0;
24             right:0;
25             opacity: 0;
26             z-index: 100;
27         }
28     </style>
29 </head>
30 <body>
31     <div class="div1">
32         <input type="file"id="fafa" name="fafa"/>
33         <a class="upload">上传</a>
34     </div>
35     <input type="button" value="xhr提交" onclick="xhrClick()" />
36     </form>
37     <script src="/static/jquery-3.2.1.js"></script>
38     <script>
39         function xhrClick() {
40             var file_obj = document.getElementById(fafa).files[0];
41             var xhr = new XMLHttpRequest();
42             var fd = new FormData();
43             fd.append(username,dandy);
44             fd.append(fafafa, file_obj);
45             xhr.open(POST, /upload_test/, true);
46             xhr.onreadystatechange = function() {
47                 if (xhr.readyState == 4){
48                     var obj = JSON.parse(xhr.responseText);
49                     console.log(obj)
50                 }
51             };
52             xhr.send(fd)
53         }
54     </script>
55 </body>
56 </html>
xhr demo
技术分享图片
1 def upload_test(request):
2     username = request.POST.get(‘username‘)
3     fafafa = request.FILES.get(‘fafafa‘)
4     print(username, fafafa)
5     with open(fafafa.name, ‘wb‘) as f:
6         for item in fafafa.chunks():
7             f.write(item)
8     ret = {‘code‘:‘xxx‘, ‘data‘:username}
9     return HttpResponse(json.dumps(ret))
view.py

大家可以好好研究上面的示例里面的上传的样式,主流的网站上很多的上传就是这种格式做出来的。要看一下原理是什么就好。另外前端是通过FormData来封装的数据(append)。

 

b、JQuery Ajax

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display: inline-block;
 9             padding: 5px;
10             background-color: #d0e9c6;
11             text-align: center;
12             line-height: 30px;
13         }
14         .div1{
15             position: relative;
16             width: 100px;
17             height: 50px;
18         }
19         #fafa{
20             position: absolute;
21             top:0;
22             bottom:0;
23             left:0;
24             right:0;
25             opacity: 0;
26             z-index: 100;
27         }
28     </style>
29 </head>
30 <body>
31     <div class="div1">
32         <input type="file"id="fafa" name="fafa"/>
33         <a class="upload">上传</a>
34     </div>
35     <input type="button" value="xhr提交" onclick="xhrClick()" />
36     <input type="button" value="xhr提交" onclick="jqClick()" />
37     <script src="/static/jquery-3.2.1.js"></script>
38     <script>
39         function jqClick() {
40             var file_obj = document.getElementById(fafa).files[0];
41             var fd = new FormData();
42             fd.append(username,dandy);
43             fd.append(fafafa, file_obj);
44             $.ajax({
45                 url:/upload_test/,
46                 type:POST,
47                 data: fd,
48                 processData:false, // tell jquery not to process the data
49                 contentType:false, // tell jquery not to set contentType
50                 success:function(arg, a1, a2) {
51                     console.log(arg);
52                     console.log(a1);
53                     console.log(a2);
54                 }
55             })
56         }
57 
58         function xhrClick() {
59             var file_obj = document.getElementById(fafa).files[0];
60             var xhr = new XMLHttpRequest();
61             var fd = new FormData();
62             fd.append(username,dandy);
63             fd.append(fafafa, file_obj);
64             xhr.open(POST, /upload_test/, true);
65             xhr.onreadystatechange = function() {
66                 if (xhr.readyState == 4){
67                     var obj = JSON.parse(xhr.responseText);
68                     console.log(obj)
69                 }
70             };
71             xhr.send(fd)
72         }
73     </script>
74 </body>
75 </html>
ajax demo

因为Ajax是对于xhr的封装,所以还是需要借助FormData来封装。另外注意下面2个设置(这2个坑很多人遇到过)。

processData:false, // tell jquery not to process the data

contentType:false, // tell jquery not to set contentType

 

c、iframe

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display: inline-block;
 9             padding: 5px;
10             background-color: #d0e9c6;
11             text-align: center;
12             line-height: 30px;
13         }
14         .div1{
15             position: relative;
16             width: 100px;
17             height: 50px;
18         }
19         #fafa{
20             position: absolute;
21             top:0;
22             bottom:0;
23             left:0;
24             right:0;
25             opacity: 0;
26             z-index: 100;
27         }
28     </style>
29 </head>
30 <body>
31     <div class="div1">
32         <input type="file"id="fafa" name="fafa"/>
33         <a class="upload">上传</a>
34     </div>
35     <input type="button" value="xhr提交" onclick="xhrClick()" />
36     <input type="button" value="xhr提交" onclick="jqClick()" />
37     <hr/>
38 
39     <form action="/upload_test/" method="POST" enctype="multipart/form-data" target="iframe1">
40         <iframe id="iframe1" name="iframe1" style="display: none;"></iframe>
41         <input type="file" name="fafafa">
42         <input type="submit" onclick="submitForm();" value="iframe提交">
43     </form>
44     <script src="/static/jquery-3.2.1.js"></script>
45     <script>
46         function jqClick() {
47             var file_obj = document.getElementById(fafa).files[0];
48             var fd = new FormData();
49             fd.append(username,dandy);
50             fd.append(fafafa, file_obj);
51             $.ajax({
52                 url:/upload_test/,
53                 type:POST,
54                 data: fd,
55                 processData:false, // tell jquery not to process the data
56                 contentType:false, // tell jquery not to set contentType
57                 success:function(arg, a1, a2) {
58                     console.log(arg);
59                     console.log(a1);
60                     console.log(a2);
61                 }
62             })
63         }
64 
65         function xhrClick() {
66             var file_obj = document.getElementById(fafa).files[0];
67             var xhr = new XMLHttpRequest();
68             var fd = new FormData();
69             fd.append(username,dandy);
70             fd.append(fafafa, file_obj);
71             xhr.open(POST, /upload_test/, true);
72             xhr.onreadystatechange = function() {
73                 if (xhr.readyState == 4){
74                     var obj = JSON.parse(xhr.responseText);
75                     console.log(obj)
76                 }
77             };
78             xhr.send(fd)
79         }
80 
81         function submitForm() {
82             $(#iframe1).on(load, function(){
83                 var text = $(#iframe1).contents().find(body).text();
84                var obj = JSON.parse(text);
85                console.log(obj)
86             })
87         }
88     </script>
89 </body>
90 </html>
iframe demo

看到这里相信已经很明白了,主流的、更为推荐的传输文件的一定是最后的iframe。

所以传输文件的时候的推荐优先级是

a、iframe        b、ajax        c、xhr

说到这,梳理下上传头像预览的功能:

凭接触的经验可以写出下面的实现操作步骤,需要一个异步操作(iframe来完成),文件保存在服务器上的固定的文件夹内,返回文件路径,网页的图片标签赋值一个路径就ok了。

技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display: inline-block;
 9             padding: 5px;
10             background-color: #d0e9c6;
11             text-align: center;
12             line-height: 30px;
13         }
14         .div1{
15             position: relative;
16             width: 100px;
17             height: 50px;
18         }
19         #fafa{
20             position: absolute;
21             top:0;
22             bottom:0;
23             left:0;
24             right:0;
25             opacity: 0;
26             z-index: 100;
27         }
28     </style>
29 </head>
30 <body>
31     <div class="div1">
32         <input type="file"id="fafa" name="fafa"/>
33         <a class="upload">上传</a>
34     </div>
35     <input type="button" value="xhr提交" onclick="xhrClick()" />
36     <input type="button" value="xhr提交" onclick="jqClick()" />
37     <hr/>
38 
39     <form action="/upload_test/" method="POST" enctype="multipart/form-data" target="iframe1">
40         <iframe id="iframe1" name="iframe1" style="display: none;"></iframe>
41         <input type="file" name="fafafa">
42         <input type="submit" onclick="submitForm();" value="iframe提交">
43     </form>
44     <img id="iiiimg" />
45     <script src="/static/jquery-3.2.1.js"></script>
46     <script>
47         function jqClick() {
48             var file_obj = document.getElementById(fafa).files[0];
49             var fd = new FormData();
50             fd.append(username,dandy);
51             fd.append(fafafa, file_obj);
52             $.ajax({
53                 url:/upload_test/,
54                 type:POST,
55                 data: fd,
56                 processData:false, // tell jquery not to process the data
57                 contentType:false, // tell jquery not to set contentType
58                 success:function(arg, a1, a2) {
59                     console.log(arg);
60                     console.log(a1);
61                     console.log(a2);
62                 }
63             })
64         }
65 
66         function xhrClick() {
67             var file_obj = document.getElementById(fafa).files[0];
68             var xhr = new XMLHttpRequest();
69             var fd = new FormData();
70             fd.append(username,dandy);
71             fd.append(fafafa, file_obj);
72             xhr.open(POST, /upload_test/, true);
73             xhr.onreadystatechange = function() {
74                 if (xhr.readyState == 4){
75                     var obj = JSON.parse(xhr.responseText);
76                     console.log(obj)
77                 }
78             };
79             xhr.send(fd)
80         }
81 
82         function submitForm() {
83             $(#iframe1).on(load, function(){
84                 var text = $(#iframe1).contents().find(body).text();
85                 var obj = JSON.parse(text);
86                 $(#iiiimg).attr(src, / + obj.path)
87             })
88         }
89     </script>
90 </body>
91 </html>
html demo
技术分享图片
 1 def upload_test(request):
 2     username = request.POST.get(‘username‘)
 3     fafafa = request.FILES.get(‘fafafa‘)
 4     import os
 5     file_path = os.path.join("static/images", fafafa.name)
 6     with open(file_path, ‘wb‘) as f:
 7         for item in fafafa.chunks():
 8             f.write(item)
 9     ret = {‘code‘:‘xxx‘, ‘path‘:file_path}
10     return HttpResponse(json.dumps(ret))
view demo

 

Python 20 Ajax全套

标签:put   element   pwd   介绍   cli   async   data   过程   inf   

原文地址:https://www.cnblogs.com/wuzdandz/p/8387371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!