Ajax、序列化

Ajax、序列化

Ajax

1、简介

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

Ajax其实就是利用浏览器提供一个特殊的对象异步地向服务器发送请求。服务器返回部分数据,浏览器让我们利用这些数据对象对页面做部分更新,整个过程页面不刷新,不会打断用户操作,会自动更新某些页面变化。

同步和异步的区别:
	同步:客户端与服务端交互时,客户端不能镜像其它操作,只能等待服务器端的响应结束才能操作,且会刷新页面。
    eg:form表单
	异步:当客户端进行页面操作是,同时可以与服务端进行交互,服务器响应客户端信息,将信息更新到页面,且不会刷新页面。
    eg:码云注册手机号输入框
    
'''
Ajax其实就是js自带的功能,不是一门新的技术点,我们学习的是jQuery封装之后的版本。
重点:异步提交,局部刷新
'''

2、基础语法

$.ajax({
    url:'', // 等价于form标点的action参数,控制数据的提交地址
    type:'', // 等价于form表单的method参数,控制请求方式,默认是get请求
    data:{}, // 要发送给后端的数据
    success:function (形参){  //形参args就是用于接收后端返回的结果
		异步回调函数
     }
})


eg:
<input type="text" id="d1">&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;<input type="text" id="d2">&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;<input type="text" id="d3">
<input type="button" value="计算" id="subBtn">

    <script>
    {#    $('#subBtn').click(function (){#}
    {#        // 朝后端发送数据使用Ajax#}
    {#        $.ajax({#}
    {#            url:'', // 等价于form标点的action参数#}
    {#            type:'post', // 等价于form表单的method参数#}
    {#            data:{'i1':$('#d1').val(), 'i2':$('#d2').val()}, // 要发送给后端的数据#}
    {#            success:function (args){  //形参args就是用于接收后端返回的结果#}
                    {#alert(args)#}
    {#                $('#d3').val(args)#}
    {#            }#}
    {#        })#}
    {#    })#}
    $('#d2').blur(function (){
        $.ajax({
                url:'', // 等价于form标点的action参数
                type:'post', // 等价于form表单的method参数
                data:{'i1':$('#d1').val(), 'i2':$('#d2').val()}, // 要发送给后端的数据
                success:function (args){  //形参args就是用于接收后端返回的结果
                    {#alert(args)#}
                    $('#d3').val(args)
                }
            })
    })
    </script>

3、数据编码格式

Content-Type
格式1:urlencoded
数据格式:name = jason&pwd=123&hobby=read
django后端统一处理到request.POSt中

格式2:formddata
数据格式:无法查阅
django后端自动将文件数据处理到request.FILES
普通数据处理到request.POST

格式3:application/json
数据格式:JSON格式
django后端不会处理,在request.body中存储(bytes类型),自己处理
语法注意事项:
data: JSON.stringify({'name':'jason','pwd':123}),  # data data data 可别再错了
contentType:'application/json',
    
'''端接收前端传来的json数据时,django会将数据都放在request.body中,但是body中的数据是二进制数据,所以我们还需要使用json.loads将数据转换成python的基本数据类型。'''
    
abAjax,html
$('#d1').on('click',function (){
            $.ajax({
                url:'',
                type:'post',
                data:JSON.stringify({'name':'jason','pwd':123}), # 序列化
                contentType:'application/json',
                success:function (args){

        		}
            })
        })
views.py
def ab_ajax(request):
    if request.is_ajax():
        if request.method == 'POST':
            print(request.POST)  # <QueryDict: {}>
            print(request.FILES)  # <MultiValueDict: {}>
            print(request.body)  # b'{"name":"jason","pwd":123}'
            json_bytes = request.body
            import json
            json_dict = json.loads(json_bytes)
            print(json_dict, type(json_dict))  # {'name': 'jason', 'pwd': 123} <class 'dict'>
    return render(request, 'abAjax.html')

4、Ajax携带文件数据

<input type="text" id="d1">
<input type="file" id="d2">
<button id="d3">点我</button>
<script>
$('#d3').click(function (){
    //1.产生内置对象
    let formData = new FormData();
    //2.添加普通数据
    formData.append('username',$('#d1').val())
    //3.添加文件数据
    formData.append('file',$('#d2')[0].files[0])
    //4.发送Ajax请求
    $.ajax({
        url:'',
        type:'post',
        data:formData,
        contentType:false,  //不使用任何编码
        processData: false,  // 不处理数据对象
        success:function (args){

        }
    })
})
</script>

'''普通数据都在request.POST中,文件数据在request.FILSE中'''

5、回调函数

后端和Ajax交互,不应该返回页面,通常情况下返回JSON格式数据
前端针对HttpResponse和JsonResponse返回JSON格式数据处理策略不同:
前者不会自动反序列化,而后者会自动反序列化
如果想要前者也自动反序列化可添加一个固定的参数:dataType:'JSON'
return HttpResponse(json.dumps({'name':'jason','pwd':123}))
$.ajax({
    url:'',
    type:'post',
    data:formData,
    contentType:false,  //不使用任何编码
    processData: false,  // 不处理数据对象
    dataType:'JSON',
    success:function (args){
        alert(args)
            console.log(typeof args)
            console.log(args)
        }
    })

eg:返回页面:
return HttpResponse('https://www.baidu.com')
$.ajax({
    url:'',
    type:'post',
    data:formData,
    contentType:false,  //不使用任何编码
    processData: false,  // 不处理数据对象
    success:function (args){
        alert(args)
        window.location.href = args
    }
})

序列化

def get_book(request):
    book_query = models.Book.objects.all()
    # 将数据构造成jason格式{'pk':1,'title':'书'}
    # book_list = []
    # for book_obj in book_query:
    #     temp_dict = {}
    #     temp_dict['pk'] = book_obj.pk
    #     temp_dict['title'] = book_obj.title
    #     temp_dict['price'] = book_obj.price
    #     book_list.append(temp_dict)
    from django.core import serializers
    # 调用该模块的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret = serializers.serialize('json',book_query)
    return HttpResponse(ret)
posted @ 2022-09-07 23:06  努力努力再努力~W  阅读(113)  评论(0)    收藏  举报