Ajax全套

Posted Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax全套相关的知识,希望对你有一定的参考价值。

 

Ajax前戏之json:

1、什么是json?

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。

 

2、json对象和JavaScript对象的关系

json对象javascript对象的子集,json继承了JavaScript的number,string(" "),bool,null,array,{"name":"egon" ,"age ":18} 注意json只支持双引号 

 

3、json对象和json字符串的关系: 

json字符串就是json对象+引号的字符串化,‘json对象  ’,json对象=JS对象,json字符串‘ 里面’存储的JavaScript的数据类型,所以相比其他语言JavaScript把json字符串解析成JS对象有天然优势;

 

3、json字符串和Python的关系

Python有Python的数据类型,JS有JS的数据类型,但前后端之所以可以交互,是因为中间有 json字符串做中间转换;

 

 

   

合格的json对象:

["one", "two", "three"]

{ "one": 1, "two": 2, "three": 3 }

{"names": ["张三", "李四"] }

[ { "name": "张三"}, {"name": "李四"} ]
View Code

不合格的json对象

{ name: "张三", \'age\': 32 }                     // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

{ "name": "张三", "age": undefined }            // 不能使用undefined

{ "name": "张三",
  "birthday": new Date(\'Fri, 26 Aug 2011 07:13:10 GMT\'),
  "getName":  function() {return this.name;}    // 不能使用函数和日期对象
}
View Code

 

4、JavaScript的JSON.stringify()和JSON.stringify()方法

JSON.stringify(JS对象)     将JS对象序列化成 JSON字符串    ------->python的json.dumps()

<script>
{#JSON.stringify(JS对象) 将JS对象序列化成 JSON字符串#}
    console.log(typeof JSON.stringify([1,2,2,2]))
    console.log(typeof JSON.stringify({\'name\':\'egon\'}))
</script>
View Code

JSON.parse(\'JSON对象\')    将json字符串反序列化成 JS对象--------->python的json.loads()

<script>
{#    JSON.parse(\'JSON对象\')   将json字符串反序列化成 JS对象    #}
    console.log(JSON.parse(\'{"name":"egon","age":18}\'))
    console.log(JSON.parse(\'[1,2,3,4,5]\'))
</script>
View Code

 

5、json和XML的比较

 JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML数据交换格式。

 

用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8"?>
<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
            <city>哈尔滨</city>
            <city>大庆</city>
        </cities>
    </province>
    <province>
        <name>广东</name>
        <cities>
            <city>广州</city>
            <city>深圳</city>
            <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台湾</name>
        <cities>
            <city>台北</city>
            <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
            <city>乌鲁木齐</city>
        </cities>
    </province>
</country>
View Code

用JSON表示如下:

{
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": {
            "city": ["哈尔滨", "大庆"]
        }
    }, {
        "name": "广东",
        "cities": {
            "city": ["广州", "深圳", "珠海"]
        }
    }, {
        "name": "台湾",
        "cities": {
            "city": ["台北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
View Code

 

优:

可以看到,JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用得带宽。

劣:

注意:

JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。
但是国人的一款在线工具 BeJson 、SoJson在线工具让众多程序员、新接触JSON格式的程序员更快的了解JSON的结构,更快的精确定位JSON格式错误

http://www.bejson.com/

 

6.把Python的datetime时间数据类型,转换成json字符串的方式

class DatetimeSerializer(json.JSONEncoder):
    """
    实现 date 和 datetime 类型的 JSON 序列化,以符合 公司数据格式要求。
    """

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            head_fmt = "%Y-%m-%d %H:%M:%S"
            return "{main_part}.{ms_part}".format(
                main_part=obj.strftime(head_fmt),
                ms_part=int(obj.microsecond / 1000))
        elif isinstance(obj, datetime.date):
            fmt = \'%Y-%m-%d\'
            return obj.strftime(fmt)
        return json.JSONEncoder.default(self, obj)
date 和 datetime 类型的 JSON 序列化
 def to_json(self, d):
        return json.dumps(d, cls=DatetimeSerializer)

 

 

 

 

 

 

Ajax是什么?

AJAXAsynchronous Javascript And XML)翻译成中文就是异步JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,可以指定json),相对于Form表单而言的,提交时可以偷偷向后台发数据,页面不刷新;

 

2大特点:

1、和server端异步交互

2、偷偷向server端发送数据,页面

 

和form、a标签的区别

ajax、form、a标签都可以基于html页面向server端发送request,

但本质区别是form、a标签一般向server索要的是页面,而ajax则是字符串数据;

 

 

Jquery和Ajax关系:

Jquery没有Ajax功能,它之所以可以调用Ajax向服务端提交数据,是因为Jquey封装了原生Ajax的代码

使用原生Ajax的优势:

使用Ajax直接使用JS的XMLHttp Request对象, 无需引入Jquery了。这样响应客户端携带信息量减少,可节省流量。

 

一、Ajax种类

 

 0、在发送ajax之前初始化ajax设置, beforeSend 函数;(如何在发送ajax之前,做一些操作)

例如设置发送ajax需要携带的CSRF-TOCKEN

 function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            // 请求头中设置一次csrf-token
            if(!csrfSafeMethod(settings.type)){
                xhr.setRequestHeader("X-CSRFToken", $.cookie(\'csrftoken\'));
            }
        }
    });
View Code

 

1、jQueryAjax

不再过多赘述,就是jQuery框架封装了原生Ajax实现出来的;

<script>
    $(\'p button\').click(function () {
      var $user=$(\'p input\').val()
       d={
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": {
            "city": ["哈尔滨", "大庆"]
        }
    }, {
        "name": "广东",
        "cities": {
            "city": ["广州", "深圳", "珠海"]
        }
    }, {
        "name": "台湾",
        "cities": {
            "city": ["台北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
}
     d=JSON.stringify(d)
      $.ajax({
           url:\'/ajax/\',
           type:\'POST\',
{# traditional:一般是我们的data数据有数组时会用到 #}
           traditional:true,
           data:d,
{#  ----------------- ajax的回调函数----------------------#}
{#       1、server端response 200成功,执行的回调函数#}
           success:function (data) {
               data=JSON.parse(data)
               console.log(typeof data)},
{#      2、erver端 response错误,执行的回调函数 #}
           error:function () {
               console.log(arguments)
               alert(123) },
{#      3、无论server端返回的结果如何,都会执行的回调函数#}
           complete:function () {
               alert(321)  },
{#      4、根据server端返回的状态码,执行的回调函数#}
           statusCode:{
               \'403\':function () {alert(403)},
               \'503\':function () {alert(503)}

           }
          })
    })
</script>
View Code

 Django 响应错误状态码 

def Ajax(request):
    d=json.loads(request.body)
    print(d)
    province=d[\'province\'][0]
    print(province)
    d={\'city\': [\'哈尔滨\', \'大庆\']}
    HttpResponse.status_code=503
    # return HttpResponse(json.dumps(d))
    return HttpResponse(\'OK\')
View Code

 $.ajax参数

请求参数

data:
ajax请求要携带的数据是肯定是一个json的object对象,ajax方法就会默认地把它编码成urlencode (urlencoded:?a=1&b=2)就像form表单、a标签格式的数据发送给server,此外,ajax默认以get方式发送请求。


注意:因为ajax要携带的数据是json的object对象,也会默认编码成urlcode格式,思考 如果你用 requests模块或者原生ajax向server发送数据、或者发送json数据,应该怎么做?
当然要指定 数据content-Type 和报头信息?

#-----------------------------------------------------------------
processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;if为false,
             那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString()
             ,最后得到一个[object,Object]形式的结果。



#-----------------------------------------------------------------------



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:一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]},
              traditional为false会对数据进行深层次迭代;
View Code

响应参数

/*

dataType:  预期服务器返回的数据类型,服务器端返回的数据会根据这个值解析后,传递给回调函数。
            默认不需要显性指定这个属性,ajax会根据服务器返回的content Type来进行转换;
            比如我们的服务器响应的content Type为json格式,这时ajax方法就会对响应的内容
            进行一个json格式的转换,if转换成功,我们在success的回调函数里就会得到一个json格式
            的对象;转换失败就会触发error这个回调函数。如果我们明确地指定目标类型,就可以使用
            data Type。
            dataType的可用值:html|xml|json|text|script
            见下dataType实例

*/
View Code

 

2.原生的ajax

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

XmlHttpRequest对象的主要方法:

XmlHttpRequest.open("请求方法","请求的url",是否执行回调函数?)

send用户发送请求

在请求体里

setRequestHead()
在请求头里设置数据


getRespnseHeaders()
获取所有响应头数据

getRespnseHeader(响应头)
获取响应头中指定得header对应值


abort 终止请求
View Code

XmlHttpRequest对象的属性:

bj.readyState XMLHttpResposr的状态

0:未初始化,尚未调用open方法
1:启动调用了open方法
2:发送已经调用了send方法
3:接收状态(已经接收了部分数据)
4:完成(接收完毕服务端响应的数据)


只要对象的ready State改变就会执行该函数
xhr.onreadystatechange=function () {
            
        }



obj.responseText 服务端返回的数据(字符串类型)
obj.responseXML 服务端返回的数据(XML对象)

obj.number states 服务端返回的状态码
obj.response stateText 服务端返回的状态信息
View Code

 

使用XmlHttpRequest对象发送 GET请求

    function add1() {
{#        得到一个XMLHttpRequest对象 xhr   #}
        var xhr=new XMLHttpRequest();
{#        open打开一个http连接到指定url   XMLHttpRequest请求#}
        xhr.open(\'get\',\'/add1/?i1=18&name=张根 \')
          {#       设置请求体的数据#}
        xhr.send()
{#        XMLHttpRquest的状态改变这个函数的状态就会执行jquryAjax中的success回调函数就是基于此#}
        xhr.onreadystatechange=function () {
            if(xhr.readyState==1){console.log("对象未调用open方法")}
            if(xhr.readyState==2){console.log("请求发送")}
            if(xhr.readyState==3){console.log("接收中")}
            if (xhr.readyState == 4) {console.log(xhr.responseText)}}
    }
View Code

 

使用XmlHttpRequest对象发送 POST请求

function add1() {

var xhr= new XMLHttpRequest()
xhr.open(\'post\',\'/add1/\')
xhr.send(\'name=张根&age=12\')
}
View Code

 

 问题出现了为什么后端request.post方法没有数据呢?

使用jQuery发送post请求jQuery会默认把 发送的数据(js对象)编码成urlencoded格式,使用原生ajax就不会了,

所以使用原生ajax发POST请求之前,请求头中 务必要指定数据的编码格式“Content-Type”, “application/x-www-form-urlencoded”才能发到server端;

function add1() {
var xhr= new XMLHttpRequest()
xhr.open(\'post\',\'/add1/\')
xhr.setRequestHeader("ConTent-Type" ,"application/x-www-form-urlencoded")
xhr.send(\'name=张根&age=12\')
               }
View Code

 

 

 3、iframe标签+form表单伪造Ajax

 

所谓伪装Ajax操作就是不利于任何Ajax,利于其他技术向后台发送数据,这个其他的技术要从 iframa标签说起。。。。。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎来到乐X网</title>
</head>
<body>

<iframe style="width:1000px; height:2000px" 

src="https://www.hhh286.com/htm/movieplay1/6748.htm" ></iframe>

</body>
</html>
View Code

神奇的一幕发生了 自动跳转到其他网站了

还可以 这么玩

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎来到乐C网</title>
</head>
<body>
<div>
    <input type="text"<

以上是关于Ajax全套的主要内容,如果未能解决你的问题,请参考以下文章

Ajax全套

Django(十九)Ajax全套

Ajax全套

Ajax全套

低价2020前端Ajax入门全套教程

框架----Django之Ajax全套实例