关于异步——AJAX

Posted 一条上镜的咸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于异步——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())

以上是关于关于异步——AJAX的主要内容,如果未能解决你的问题,请参考以下文章

关于Ajax的异步刷新功能及简单案例(php)

关于ajax异步请求不到数据的问题 302跨域请求

JS 关于AJAX异步的说明

关于其活动的片段生命周期

关于ajax

关于异步请求AJAX的具体解释