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

Posted mayrain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前后端传输数据的编码格式(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}}
]
写接口就是利用序列化组件渲染数据然后写一个接口文档 该交代交代一下就完事
"""

 

以上是关于前后端传输数据的编码格式(contentType)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

后端传输数据的编码格式(contentType)

后端传输数据的编码格式(contentType)

编码格式分类: 前后端传递数据的编码格式contentType

Django---进阶8