前后端傳輸數據的編碼格式(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}}
]
寫接口就是利用序列化組件渲染數據然后寫一個接口文檔 該交代交代一下就完事
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM