zoukankan      html  css  js  c++  java
  • 前后端传输数据的编码格式(contentType)

    # 我们主要研究post请求数据的编码格式
    """
    get请求数据就是直接放在url后面的
    url?username=jason&password=123
    """
    
    # 可以朝后端发送post请求的方式
        """
        1.form表单
        2.ajax请求
        """
    
      
    """
    前后端传输数据的编码格式
        urlencoded
        
        formdata
        
        json
    """
    # 研究form表单
        默认的数据编码格式是urlencoded
      数据格式:username=jason&password=123
      django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中
          username=jason&password=123    >>> request.POST
      
      如果你把编码格式改成formdata,那么针对普通的键值对还是解析到request.POST中而将文件解析到request.FILES中
      
      form表单是没有办法发送json格式数据的
     
    
    # 研究ajax
        默认的编码格式也是urlencoded
      数据格式:username=jason&age=20
        django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中
          username=jason&age=20    >>> request.POST

    ajax发送json格式数据

    """
    前后端传输数据的时候一定要确保编码格式跟数据真正的格式是一致的
    不要骗人家!!!
    
    {"username":"jason","age":25}  
        在request.POST里面肯定找不到
        
        django针对json格式的数据 不会做任何的处理 
        
    request对象方法补充
        request.is_ajax()
            判断当前请求是否是ajax请求 返回布尔值
    
    """
    
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:JSON.stringify({'username':'jason','age':25}),
                contentType:'application/json',  // 指定编码格式
                success:function () {
    
                }
            })
        })
    </script>
    
            json_bytes = request.body
            json_str = json_bytes.decode('utf-8')
            json_dict = json.loads(json_str)
    
            # json.loads括号内如果传入了一个二进制格式的数据那么内部自动解码再反序列化
            json_dict = json.loads(json_bytes)
            
    """
    ajax发送json格式数据需要注意点
        1.contentType参数指定成:application/json
        2.数据是真正的json格式数据
        3.django后端不会帮你处理json格式数据需要你自己去request.body获取并处理
    """

    ajax发送文件

    """
    ajax发送文件需要借助于js内置对象FormData
    
    """
    <script>
        // 点击按钮朝后端发送普通键值对和文件数据
        $('#d4').on('click',function () {
            // 1 需要先利用FormData内置对象
            let formDateObj = new FormData();
            // 2 添加普通的键值对
            formDateObj.append('username',$('#d1').val());
            formDateObj.append('password',$('#d2').val());
            // 3 添加文件对象
            formDateObj.append('myfile',$('#d3')[0].files[0])
            // 4 将对象基于ajax发送给后端
            $.ajax({
                url:'',
                type:'post',
                data:formDateObj,  // 直接将对象放在data后面即可
    
                // ajax发送文件必须要指定的两个参数
                contentType:false,  // 不需使用任何编码 django后端能够自动识别formdata对象
                processData:false,  // 告诉你的浏览器不要对你的数据进行任何处理
    
                success:function (args) {
                }
            })
    
    
        })
    </script>
    
    def ab_file(request):
        if request.is_ajax():
            if request.method == 'POST':
                print(request.POST)
                print(request.FILES)
        return render(request,'ab_file.html')
      
    """
    总结:
        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中
    """

    django自带的序列化组件(drf做铺垫)

    """
    如果发现你可以直接使用MySQL但是无法使用sqlite3
    不要慌张不要恐惧 你只需要按照之前MySQL的操作将sqlite3的驱动装一下即可
    """
    # 需求:在前端给我获取到后端用户表里面所有的数据 并且要是列表套字典
    import json
    from django.http import JsonResponse
    from django.core import serializers
    def ab_ser(request):
        user_queryset = models.User.objects.all()
        # [{},{},{},{},{}]
        # user_list = []
        # for user_obj in user_queryset:
        #     tmp = {
        #         'pk':user_obj.pk,
        #         'username':user_obj.username,
        #         'age':user_obj.age,
        #         'gender':user_obj.get_gender_display()
        #     }
        #     user_list.append(tmp)
        # return JsonResponse(user_list,safe=False)
        # return render(request,'ab_ser.html',locals())
    
        # 序列化
        res = serializers.serialize('json',user_queryset)
        """会自动帮你将数据变成json格式的字符串 并且内部非常的全面"""
        return HttpResponse(res)
    """
    [
     {"pk": 1, "username": "jason", "age": 25, "gender": "male"}, 
     {"pk": 2, "username": "egon", "age": 31, "gender": "female"},
     {"pk": 3, "username": "kevin", "age": 32, "gender": "others"}, 
     {"pk": 4, "username": "tank", "age": 40, "gender": 4}
     ]
    前后端分离的项目
        作为后端开发的你只需要写代码将数据处理好
        能够序列化返回给前端即可 
            再写一个接口文档 告诉前端每个字段代表的意思即可
            
            
    [
    {   "model": "app01.user", 
        "pk": 1, 
        "fields": {"username": "jason", "age": 25, "gender": 1}}, 
        
    {   "model": "app01.user", 
        "pk": 2, 
        "fields": {"username": "egon", "age": 31, "gender": 2}}, 
        
    {   "model": "app01.user", 
        "pk": 3, 
        "fields": {"username": "kevin", "age": 32, "gender": 3}},
         
    {   "model": "app01.user", 
        "pk": 4, 
        "fields": {"username": "tank", "age": 40, "gender": 4}}
    ]
    写接口就是利用序列化组件渲染数据然后写一个接口文档 该交代交代一下就完事
    """
  • 相关阅读:
    简易发号SQL,可用于生成指定前缀自增序列--改进版
    关于【【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)】IS NOT NULL测试
    简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
    [EntityFramework]记录Linq中如何比较数据库中Timestamp列的方法(如大于0x00000000000007D1的记录)
    [高并发]抢红包设计(使用redis)
    [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路--验证码
    [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路---部署
    【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
    Unity光晕剑效果的Shader简单实现
    Unity3D 调用Android与IOS的剪贴板
  • 原文地址:https://www.cnblogs.com/mayrain/p/13069130.html
Copyright © 2011-2022 走看看