zoukankan      html  css  js  c++  java
  • 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)

        

  • 相关阅读:
    easyui datagride 两种查询方式
    SharePoint常用目录介绍
    sharepoint 2013 入门1_ 建立一个网页程序
    Windows2012 显示我的电脑
    你知道 react-color 的实现原理吗
    如何实现 Promise 池
    如何使 pdf 文件在浏览器里面直接下载而不是打开
    macOS 安装 oh-my-zsh 之后 node 失效的问题
    剑指offer[47]——求1+2+3+...+n
    剑指offer[46]——孩子们的游戏(圆圈中最后剩下的数)
  • 原文地址:https://www.cnblogs.com/jacky912/p/10451283.html
Copyright © 2011-2022 走看看