关于异步——AJAX

MTV 与 MVC

MVC : Model View Controller 模型-视图-控制器

是一种Web架构的模式。特点:把业务逻辑、模型数据、用户界面分离开来,让开发者将数据与表现解耦。

Model: 代表数据存取层,

View 代表的是系统中选择显示什么和怎么显示的部分,

Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

MTV : Model Templates View 模型-模板-视图

1.Models:数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效,是一个抽象层,用来构建和操作你的web应用中的数据,模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。

2.模板(templates):即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。模板层提供了设计友好的语法来展示信息给用户。使用模板方法可以动态地生成HTML。模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。

3.视图(views):业务逻辑层,该层包含存取模型及调取恰当模板的相关逻辑。用于封装负责处理用户请求及返回响应的逻辑。视图可以看作是前端与数据库的中间人,他会将前端想要的数据从数据库中读出来给前端。他也会将用户要想保存的数据写到数据库。

区别 :

MVC中的View的目的是「呈现哪一个数据」,而MTV的View的目的是「数据如何呈现」。

也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一个请求发送到一个合适的视图。

AJAX(***重点***)

同步与异步

同步:
    一个进程在执行某个请求时,如果该请求需要一段时间才能返回信息,那么,这个请求会卡在这,直到收到返回信息才继续执行下去

异步:
    在上面那种情况下,该进程不需要一直等待下去,而是发出请求后继续执行自己的代码,当请求有信息返回时,通知该进程进行处理,然后通过回调函数拿到结果,可以大大提高程序的执行效率。
    也就是说,异步是我们发出的一个请求,该请求会在后台自动发出并获取数据,然后对数据进行处理,在此过程中,我们可以继续做其他操作,不管它怎么发出请求,不关心它怎么处理数据。

总结:
    以上总结起来,通俗地讲,也就是说,同步需要按部就班地走完一整个流程,完成一整个动作,打个比方:同步的时候,你在写程序,然后你妈妈叫你马上拖地,你就必须停止写程序然后拖地,没法同时进行。而异步则不需要按部就班,可以在等待那个动作的时候同时做别的动作,打个比方:你在写程序,然后你妈妈让你马上拖地,而这时你就贿赂你弟弟帮你拖地,于是结果同样是拖好地,你可以继续敲你的代码而不用管地是怎么拖的哈哈。

同步与异步适用的场景:
    就算是ajax去局部请求数据,也不一定都是适合使用异步的,比如应用程序往下执行时以来从服务器请求的数据,那么必须等这个数据返回才行,这时必须使用同步。而发送邮件的时候,采用异步发送就可以了,因为不论花了多长时间,对方能收到就好。总结得来说,就是看需要的请求的数据是否是程序继续执行必须依赖的数据

阻塞与非阻塞

局部刷新

一个页面 不是整体刷新 而是页面的某个地方局部刷新

PS: AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

AJAX的使用

基本的ajax传递数据

1.展示一个前端页面  页面上有三个输入框  前两个框输入数字 点击按钮朝后端发请求
页面不刷新的情况下 完成数字的加法运算  

<input type="text" id="add1">+
            <input type="text" id="add2">=
            <input type="text" id="res">
            <a href="#" class="btn btn-primary" id="start">计算</a>

<script>
    $('#start').on('click',function () {
        {#var myFormData = new FormData();#}
        {#myFormData.append('add1',$("#add1").val());#}
        {#myFormData.append('add2',$("#add2").val());#}
        $.ajax({
            url:'',
            type:'post',

            data:{'add1':$('#add1').val(),'add2':$('#add2').val()},
            success:function (data) {
                {#data是从后端获得的return值#}
                $('#res').val(data)
        }
        })
    })
</script>

Ajax传json格式数据

# 前端
<script>
    var a = {'username':'a','password':'123'};

    $.ajax({
        url:'',
        type:'post',
        contentType:'application/json',
        data:JSON.stringify(a),
        success:function (data) {
            alert(data)
        },
    })
</script>
# 后端
if request.is_ajax():
    res = json.loads(request.body)
    print(request.body, type(request.body))
    # b'{"username":"a","password":"123"}' <class 'bytes'>
    return HttpResponse(request.body)

注意:
    后端接收到的数据在request.body里,并且是bytes格式的字符串

PS:
    1.指定contentType参数
        contentType:'application/json',
    2.要将你发送的数据 确保是json格式的
    data:JSON.stringify({'username':'jason','password':'123'})

AJAX传文件

# 前端
<input type="file" name="" id="myfile1">
<input type="button" id="sub1" value="123">
<script>
    $('#sub1').on('click',function () {
        var myformdata = new FormData();
        myformdata.append('username','lijian');
        myformdata.append('password','123');
        myformdata.append('myfile',$('#myfile1')[0].files[0]);
        console.log($('#myfile1')[0].files[0]);
        $.ajax({
            url:'',
            type:'post',
            data:myformdata,
            contentType:false,
            processData:false,
            success:function (data) {
                alert(data);
            }
        })

    })
</script>

# 后端
def ajax_file(request):
    if request.is_ajax():
        print(1,request.POST)
        # if request.body:
        #     print(2,request.body)
        print(3,request.FILES)
        return HttpResponse(123)
    return render(request, 'ajax_file.html')

# $('#myfile1')[0].files[0]
获取文件内容
    1.先通过jquery对象查找到file标签
        $('#file1')
    2.将jquery对象转换成原生js对象
        $('#file1')[0]
    3.利用原生js对象的方法,直接获取文件内容
        $('#myfile1')[0].files[0]
        因为获取的文件内容可以是多个,所以取第一个

注意:如何传递文件
    1.创建FormData对象
        var myFormData = new FormData();
    2.为FormData对象添加键值
        2.1普通键值
            myFormData.append('username',普通字符串);
        2.2文件
            myFormData.append('myfile',$('#t3')[0].files[0]);

    ************
    3.ajax里的几个必要参数
        data:myFormData
        contentType:false
        processData:false
        

contentType 前后端传输数据编码格式

form表单 默认的提交数据的编码格式是urlencoded
    urlencoded
        username=admin&password=123这种就是符合urlencoded数据格式

        django后端针对username=admin&password=123的urlencoded数据格式会自动解析
        将结果打包给request.POST 用户只需要从request.POST即可获取对应信息

    formdata
        django后端针对formdata格式类型数据 也会自动解析
        但是不会方法request.POST中而是给你放到了request.FILES中

    ajax
        ajax默认的提交数据的编码格式也是urlencoded
        username=jason&password=123

    总结:django后端针对不同的编码格式数据 会有不同的处理机制以及不同的获取该数据的方法

序列化组建

1.将用户表的数据 查询出来 返回给前端
给前端的是一个大字典 字典里面的数据的一个个的字段

from django.core import serializers

def ajax_load(request):
    user_list = []
    user_queryset = models.User.objects.all()
    # 方式一
    # 手动将对象的属性放入字典
    for user_obj in user_queryset:
        user_list.append({
            'id':user_obj.pk,
            'username':user_obj.username,
            'gender':user_obj.gender,
        })
    print(user_list[0],type(user_list[0]))
    # 方式二
    # 利用serializers将queryset对象反序列化成json格式字符串,并将对象的所有属性封装成列表套字典的形式
    # 因为这是一个字符串,所以要将它还原再给前端使用

    res = serializers.serialize('json',user_queryset)
    res = eval(res)
    print(res, type(res))
    # [{'model': 'user.user', 'pk': 1, 'fields': {'username': 'mark', 'gender': 1}}, {'model': 'user.user', 'pk': 2, 'fields': {'username': 'ja', 'gender': 2}}, {'model': 'user.user', 'pk': 3, 'fields': {'username': 'la', 'gender': 3}}] <class 'list'>
    print(res[0],type(res[0]))
    # {'model': 'user.user', 'pk': 1, 'fields': {'username': 'mark', 'gender': 1}} <class 'dict'>
    return render(request, 'ajax_load.html', locals())

原文地址:https://www.cnblogs.com/marklijian/p/11755183.html

时间: 2024-08-27 23:38:02

关于异步——AJAX的相关文章

vue和jQuery嵌套实现异步ajax通信

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible&qu

纯JavaScript实现异步Ajax的基本原理

Ajax实际就是XMLHttpRequest对象和DOM.(X)HTML和CSS的简称,用于概括异步加载页面内容的技术. Ajax实例 HTML代码如下,包含一个h5标题和一个按钮: JS代码如下: 上述代码中核心对象是XMLHttpRequest,这正是Ajax的技术基础.所有现代浏览器均支持XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject). XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某

jQuery之异步Ajax请求使用

$.ajax({type:'',data:'',async:''...}) 参数: 1.cache: true缓存页面 false 不缓存页面 (默认: true,dataType为script和jsonp时默认为false) 1.type:  GET /POST 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持. 2.async: tr

同步 异步 AJAX JS

jQuery:$post.$get.$ajax与php,实现异步加载 什么是异步加载? 整个最通俗的说法就是将另外一个页面上的数据通过append() 或者 html()等函数插入到本页上.纯js写法responseXML 或 responseText插入到页面中. 另外一个页可以是静态页面的可以是动态页面的,更可以是json.xml数据. 原理基本都差不多,页面方便很多只要得到我们想要的代码插入来就行,json和xml那就需要我们解析并将适当的数据放到适当的位置就行. 动态页面只要生成json

异步ajax请求数据处理

jQuery.ajax(url,[settings]) 概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest  对象.大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性. 最简单的情况下,$.ajax()可以不带任何参数直接使用. 注意,所有的选项都可以通过$.ajaxSetup()函数来全局设置. 回调函数 如果要处理$.aj

多个异步ajax请求指定顺序执行

1.比如2个ajax请求,把第二个ajax请求放在第一个ajax请求success方法里面. 2.ajax请求时添加 async: false,//使用同步的方式,true为异步方式.结果是只有等服务器返回信息以后才会继续执行后面的代码.默认为true. 3. ajax6 = $.ajax( { url: "/Home2/SelectyjLoginuser", dataType: "json", type: "post", success: fu

jquery异步ajax与服务器通信过程中如何通过then方法链式传递多层数据

我们在有些地方可能需要对服务器返回的参数做多步处理,或者很多复杂的操作必须等到服务器返回结果之后才会执行,那么我们可以用链式调用的then方法让这里做到更加易于扩展,也更加容易分离出各个功能模块.基本的方法如下. 1 doSubmit: function(){ 3 $.ajax({ 4 url: url, 5 type: 'post', 6 data: $("#fm").serialize(), 7 dataType: 'html' 8 }).then(function(data){

jQuery ajaxFileUpload.js 文件异步ajax上传

jQuery.extend({ createUploadIframe: function(id, uri)    {        //create frame        var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) {            var io = document.createElement('<iframe id="' + frameId + '" name="' + fram

异步Ajax

Ajax异步刷新应用在Web开发中经常用到,在过去WebForm中通常是使用JQuery和一般处理程序或者aspx页面来实现: 在MVC中,虽然依然可以使用一般处理程序,但是一般还是通过在Controller中新建Action方法来实现. 一. JQuery+一般处理程序 1.新建一个空MVC项目,命名为AjaxDemo 2. 右键项目,选择“添加->HTML页”,命名为ShowDateTime.html,引入jquery文件(NuGet下载jquery),代码如下: <!DOCTYPE ht