我們主要研究post請求數據的編碼格式
get請求是直接放在url后面的
url?username=haha&password=123
可以朝后端發送post請求的方式
1.form表單 2.ajax請求
前后端傳輸數據的編碼格式
1.urlencoded 2.formdata 3.json
一、研究form表單
默認的數據編碼格式是urlencoded
數據格式:username=haha&password=123
django 后端針對符合urlencoded編碼格式的數據都會幫你解析封裝到request.POST中
username=haha&password=123---->request.POST
如果把編碼格式改成formdata,那么針對普通鍵值對還是解析到request.POST中 而將文件解析到request.FILES中
form表單沒法發送json格式數據
二、研究ajax
默認編碼格式也是urlencoded
數據格式:username=haha&password=123
django后端對符合urlencoded編碼格式的數據都會自動幫你解析封裝到request.POST中
username=haha&password=123----->request.POST
ajax發送json格式數據
前后端傳輸數據的時候一定要確保編碼格式跟數據真正的格式一致
{'username':'haha','age':25}在request.POST里面肯定找不到
django針對json格式的數據 不會做任何的處理
request對象方法補充
request.is_ajax()判斷當前請求是否是ajax請求 返回布爾值
ajax發送json格式數據需要注意
1.contentType參數指定成application/json
2.數據是真正的json格式數據
3django后端不會幫你處理json格式數據需要你自己去request.body獲取並處理
前端
<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發送文件
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])
4.需要指定兩個關鍵性參數
contentType:false 不需要使用任何編碼 django后端能夠自動識別formdata對象
processData:false 告訴你的瀏覽器不要對你的數據進行任何處理
5.django后端能夠直接識別到formdata對象並且能夠將內部的普通鍵值自動解析並封裝到request.POST中 文件數據自動解析並封裝到requ.FILES中