ajax

ajax的储备知识

1.什么是ajax?

  json是指JavaScript对象表示法(JavaScript object natation)

  json是轻量级的文本数据交换格式

  json独立于语言

  json具有语言描述性

  json使用JavaScript语法来描述数据对象,但是json仍然独立于语言和平台。json解析器json库支持许多不同的编程语言。

    

       要想知道的是:json的格式来源于js

  1.js只支持单引号也支持双引号,也可以没有引号

      //在js中吧{}这样的类型叫做对象,js中没有字典一说

      data = {
          'name':'haiyan',
          "name":"haiyan",
           name:"haiyan"       
      }     //js对象默认会把自己的键当成字符串处理,所以可以加引号也可以不加

  2.json的格式:

    json只认双引号

    json一定是一个字符串

  3.合格的字符串和不合格的字符串

    合格的json对象

      ["one""two""three"]

      { "one"1"two"2"three"3 }
      {"names": ["张三""李四"] }
      [ { "name""张三"}, {"name""李四"} ] 

    不合格的json对象

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

      [32641280xFFF// 不能使用十六进制值
      { "name""张三""age": undefined }  // 不能使用undefined
      { "name""张三",
        "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
        "getName":  function() {return this.name;}  // 不能使用函数和日期对象
      }

2.Python中的序列化与反序列化

    import json

    i = 10
    s = "dsfdsf"
    l = [11,22,33]
    dic = {"name":"haiyna","age":22}
    b = True
    # #把基本数据类型转换成字符串的形式
    print(json.dumps(i),type(json.dumps(i)))   #10 <class 'str'>
    print(json.dumps(s),type(json.dumps(s)))   #"dsfdsf" <class 'str'>
    print(json.dumps(l),type(json.dumps(l)))   #[11, 22, 33] <class 'str'>
    print(json.dumps(dic),type(json.dumps(dic)))  #{"name": "haiyna", "age": 22} <class 'str'>
    print(json.dumps(b),type(json.dumps(b)))  #true <class 'str'>
 
    # ===============json序列化=============
    d = {"a":1,"b":"fdgfd"}
    data = json.dumps(d)
    print(data,type(data))
    f = open("a.txt","w")
    f.write(data)   #注意这会写进去的字符串时双引号的格式
    f.close()

3.js中的序列化与反序列化

  JSON.stringify():用于将一个JavaScript对象转换为JSON字符串

    JSON.stringify({"name","yayya"})  

  JSON.parse():用于将一个JSON字符串转换为JavaScript对象

    JSON.parse('{"name":"yaya"}');

    JSON.parse('{name:"yaya"}') ;   // 错误
    JSON.parse('[18,undefined]') ;   // 错误

二、AJAX和XML的比较  

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

  JSON 格式有两个显著的优点:书写简单,一目了然;符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。

  XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

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

  注意:JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。

     但是国人的一款在线工具 BeJson 、SoJson在线工具让众多程序员、新接触JSON格式的程序员更快的了解JSON的结构,更快的精确定位JSON格式错误。

三、AJAX简介

  1.简单介绍

    之前我们知道前端往后端发送数据的方式有:GET:地址栏、a标签、from表单

                        POST:from表单

    接下来是另一种:AJAX(也是前端向后端发送数据的一种方式)

    AJAXAsynchronous Javascript And XML)翻译成中文就是异步JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

    同步交互:客户端发送一个请求后需要等到服务器响应结束后,才能发送第二个请求

    异步交互:客户端发送一个请求后不需要等到服务器响应结束后,就可以发出第二个请求

    AJAX的特点:同步交互:当请求发送之后浏览器可以进行其他操作,无需等待服务器的响应

           局部刷新:整个过程中页面没有刷新,只是刷新页面中的局部位置而已

  AJAX常见的应用场景:

      搜索引擎根据用户输入的关键字,自动提示检索关键字。

      还有一个很重要的应用场景就是注册时候的用户名的查重。

      其实这里就使用了AJAX技术!当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,然后服务器会把查询到的结果响应给浏览器,最后再把后端返回的结果展示出来

        整个过程中页面没有刷新,只是刷新页面中的局部位置而已

        当请求发出之后,浏览器还可以进行其他操作,无需等待服务器响应

        

    当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为lemontree7777777的用户是否存在,最终服务器返回true表示名为lemontree7777777的用户已经存在了,

    浏览器在得到结果后显示用户名已被注册!

  3.AJAX的优点:

    AJAX使用JavaScript技术向服务器发送异步请求

    AJAX无需刷新整个页面

    因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高。

四、jquery实现的JAXA

  最基本的jQuery发送AJAX请求示例:

  html页面:

    <!DOCTYPE html>

    <html lang="zh-CN">
    <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>ajax test</title>
      <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    </head>
    <body>
    <button id="ajaxTest">AJAX 测试</button>
    <script>
      $("#ajaxTest").click(function () {
        $.ajax({
          url: "/ajax_test/",
          type"POST",
          data: {username: "yaya", password: 123456},
          success: function (data) {
            alert(data)
          }
        })
      })
    </script>
    </body>
    </html> 

  views.py:

    def ajax_test(request):

        user_name = request.POST.get("username")
        password = request.POST.get("password")
        print(user_name, password)
        return HttpResponse("OK") 

五、AJAX参数

  请求参数

  相应参数

    dataType:预期服务器返回的数据类型,服务器端返回的数据会根据这个值解析后,传递给回调函数。

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

六、AJAX请求如何设置csrf_token

  方式一:

    $.ajax({

      url: "/cookie_ajax/",
      type"POST",
      data: {
        "username""yaya",
        "password"123456,
        "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用JQuery取出csrfmiddlewaretoken的值,拼接到data中
      },
      success: function (data) {
        console.log(data);
      }
    }) 

  方式二:

    通过获取返回的cookie中的字符串 放置在请求头中发送

    注意:需要引入一个jquery.cookie.js插件。

      $.ajax({

        url: "/cookie_ajax/",
        type"POST",
        headers: {"X-CSRFToken": $.cookie('csrftoken')},  // 从Cookie取csrf_token,并设置ajax请求头
        data: {"username""yaya""password"123456},
        success: function (data) {
          console.log(data);
        }
      })

七、序列化

  Django内置的serializers

    def books_json(request):

        book_list = models.Book.objects.all()[0:10]
        from django.core import serializers
        ret = serializers.serialize("json", book_list)
        return HttpResponse(ret)

  我们的数据中经常有日期时间,也就是datetime对象,而json.dumps是无法处理这样在类型的,那就需要通过自定义处理器来做扩展

    class JsonCustomEncoder(json.JSONEncoder):

    """
    自定义一个支持序列化时间格式的类
    """
 
      def default(self, o):
          if isinstance(o, datetime):
              return o.strftime("%Y-%m-%d %H:%M:%S")
          elif isinstance(o, date):
              return o.strftime("%Y-%m-%d")
          else:
              return json.JSONEncoder.default(self, o)
 
    def books_json(request):
        book_list = models.Book.objects.all().values_list("title""publish_date")
        ret = json.dumps(list(book_list), cls=JsonCustomEncoder)
        return HttpResponse(ret)

    

原文地址:https://www.cnblogs.com/jacky912/p/10451283.html