32 ajax发送文件+stringify与parse方法+dataType参数+序列化模块

 

 

一、ajax发送文件

ajax发送文件需要借助于js内置对象FormData

ab_ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
文件数据:<input type="file" id="i1">
普通数据:<input type="text" id="i2">
普通数据:<input type="text" id="i3">
<button id="b1">ajax提交</button>

<script>
    $('#b1').click(function (){
        // ajax发送携带文件数据的请求,需要借助于内置对象FormData
        // 1.先生成一个FormData对象
        let formDataObj = new FormData();
        // 2.往该对象中添加数据(支持普通和文本数据)
        formDataObj.append('name',$('#i2').val());
        formDataObj.append('name',$('#i3').val());
        // 3.获取文件数据 有固定的语法格式
        formDataObj.append('file',$('#i1')[0].files[0]);     //先找到Input标签,再取索引0转成原生js,点files对象,取o
        // 发送ajax请求
        $.ajax({
            url:"/ab_file/",
            type:'post',
            // 发送文件需要额外配置的两个参数
            contentType:false,    // 不需使用任何编码 django后端能够自动识别formdata对象
            processData:false,    // 告诉你的浏览器不要对你的数据进行任何处理

            data:formDataObj,     // 直接将对象放在data后面即可
            success:function(){

            }
        })
    })
</script>
</body>
</html>

 

 views.py

from django.shortcuts import render,HttpResponse,redirect
def ab_file(request):
    if request.is_ajax():   //  判断是否是ajax请求
       if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        return HttpResponse('OK')


"""
总结:
    1.需要利用内置对象FormData
    // 2 添加普通的键值对
        formDateObj.append('username',$('#d1').val());
        formDateObj.append('password',$('#d2').val());
        // 3 添加文件对象
        formDateObj.append('myfile',$('#d3')[0].files[0])
    2.需要指定两个关键性的参数
    contentType:false,  // 不需使用任何编码 django后端能够自动识别formdata对象
        processData:false,  // 告诉你的浏览器不要对你的数据进行任何处理
    3.django后端能够直接识别到formdata对象并且能够将内部的普通键值自动解析并封装到request.POST中 
         文件数据自动解析并封装到request.FILES中

 

 

二、stringify与parse方法

JavaScript中关于JSON对象和字符串转换的两个方法:

JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象(json只认双引的字符串格式)

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

JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。

JSON.stringify({"name":"Tonny"})

三、dataType参数

date参数前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式)

"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式)"""
当后端采用HttpResponse返回json格式数据到ajax异步回调函数默认情况下需要我们自己做反序列化JSON.parse如果不想自己处理可以添加dataType:"JSON"
如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)
# 以后推荐加上 增加程序兼容性

 

ab_ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<button id="b1">ajax提交</button>

<script>
    $('#b1').on('click',function (){
        $.ajax({
            uel:'/ab_json/',
            type:'post',
            data:'',
            dataType:JSON,
            success:function(args){
                console.log(args);
                console.log(typeof args);
                // 反序列化
                {#let json_obj = JSON.parse(args);#}
                {#console.log(json_obj);#}
                {#console.log(typeof json_obj);#}
                {#console.log(json_obj.code)#}
            }
        })
    })
</script>
</body>
</html>

 

views.py

from django.shortcuts import render, HttpResponse, redirect
import json
from django.http import JsonResponse
def ab_json(request):
    back_dic = {'code':None,'msg':None}
    back_dic['code'] = 10000
    back_dic['msg'] = '一切正常'
    # return HttpResponse(json.dumps(back_dic))
    return JsonResponse(back_dic)



"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式)"""
当后端采用HttpResponse返回json格式数据到ajax异步回调函数默认情况下需要我们自己做反序列化JSON.parse如果不想自己处理可以添加dataType:"JSON"
如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)

# 以后推荐加上 增加程序兼容性

 

 

四、序列化

Django内置的serializers

什么意思呢?就是我的前段想拿到由ORM得到的数据库里面的一个个用户对象,我的后端想直接将实例化出来的数据对象直接发送给客户端,那么这个时候,就可以用Django给我们提供的序列化方式

def ser(request):
    #拿到用户表里面的所有的用户对象
    user_list=models.User.objects.all()
    #导入内置序列化模块
    from django.core import serializers
    #调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret=serializers.serialize('json',user_list)
    return HttpResponse(ret)

 

from django.core import serializers
def ab_ser(request):
    data = models.Books.objects.all()
    # new_list = []
    # for obj in data:  # 数据对象
    #     temp_dict = {}
    #     temp_dict['table'] = 'app01.Books'
    #     temp_dict['pk'] = obj.pk
    #     temp_dict['title'] = obj.title
    #     temp_dict['price'] = obj.price
    #     temp_dict['publish_name'] = obj.publish_name
    #     new_list.append(temp_dict)
    # return JsonResponse(new_list, safe=False)
    # 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret = serializers.serialize('json', data)  # DRF的前身    等同于上面的步骤
    return HttpResponse(ret)

 

 
 
posted @ 2021-12-02 17:18  甜甜de微笑  阅读(122)  评论(0编辑  收藏  举报