urlencoded 對應的數據格式:name=xxx&password=666 後端獲取數據:request.POST ps;django會將urlencoded編碼的數據解析自動放到request.POST formdata form表單傳輸文件的編碼格式 後端獲取文件格式數據:request.FILES 後端獲取普通鍵值對數據:request.POST application/json ajax發送json格式數據 須要注意的點 編碼與數據格式要一致
(1) form表單不支持異步提交局部刷新 (2) form表單不支持傳輸json格式數據 (3) form表單與ajax默認傳輸數據的編碼格式都是urlencoded
<!DOCTYPE html> <html lang="en"> <head> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> {#<input type="file" name="myfile" id="i1">#} <button id="d1">提交~</button> <script> $('#d1').click(function () { $.ajax({ // 提交的地址 url:'/index/', // 提交的方式 type:'post', // 提交的數據 data:{'name':'sean','password':'123'}, // 回調函數 success:function (data) { // data接收的就是異步提交返回的結果 alert(data) } }) }) </script>
<script> $('#d1').click(function () { var formdata = new FormData(); // FormData對象不單單能夠傳文件還能夠傳普通的鍵值對 formdata.append('name','owen'); // 獲取input框存放的文件 //$('#i1')[0]由Jquery對象變爲js對象 formdata.append('myfile',$('#i1')[0].files[0]); $.ajax({ url:'', type:'post', data:formdata, // ajax發送文件須要修改兩個固定的參數 processData:false, // 告訴瀏覽器不要處理個人數據 contentType:false, // 不要用任何的編碼,就用我formdata自帶的編碼格式,django可以自動識別改formdata對象 // 回調函數 success:function (data) { alert(data) } }) }) </script>
<script> $('#d1').click(function () { $.ajax({ url:'', // url參數能夠不寫,默認就是當前頁面打開的地址 type:'post', contentType:'application/json', data:JSON.stringify({'name':'nick','hobby':'study'}), success:function (data) { alert(data) } }) }) </script>
後臺:css
import json from django.http import JsonResponse def ajax_json(request): if request.method == 'POST': print(request.body) # json格式只有經過request.body才能查看 res = json.loads(request.body.decode('utf-8')) hobby = res.get('hobby') return HttpResponse('OK') # 必須返回HttpResponse對象 return render(request, 'ajax_json.html')
<h1>form_up</h1> <form action="" method="post" enctype="multipart/form-data"> <input type="text" name="username"> <input type="file" name="my_file"> <input type="submit"> </form>
後臺:
def index(request):
if request.method == 'POST':
print(request.POST) # 普通的鍵值對:<QueryDict: {'name': ['xxx']}>
print(request.body)
#print(request.FILES)
#傳文件< MultiValueDict: {'myfile': [ < InMemoryUploadedFile: day17課件.md(application / octet - stream) >]} >
return HttpResponse('OK')
return render(request, 'index.html')html
Django默認有七個中間件,可是django暴露給用戶能夠自定義中間件而且裏面能夠寫五種方法
jquery
中間件能夠定義五個方法,分別是:(主要的是process_request和process_response) 有response須要加上return process_request(self,request) process_response(self, request, response) process_view(self, request, view_func, view_args, view_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) 'mymiddleware.middleware.MyMiddleWare1' from django.utils.deprecation import MiddlewareMixin class MyMiddleWare(MiddlewareMixin): def process_request(self,request): print('我是第一個自定義的中間件中process_request方法') def process_response(self,request,response): print('我是第一個自定義的中間件中process_response方法') return response 拷貝方法: import copy params = copy.deepcopy(request.POST) params["firstname"] = "zhao" print(params) request.POST = params #可利用深拷貝在POST中手動添加鍵值對 #https://www.cnblogs.com/zgf-666/p/9161910.html 中間件代碼: from django.utils.deprecation import MiddlewareMixin import json class MyMiddleWare(MiddlewareMixin): def process_request(self,request): print('我是第一個自定義的中間件中process_request方法') import copy params = copy.deepcopy(request.POST) # params["firstname"] = "zhao" # print(params) # request.POST = params if not request.POST: if request.body: # < QueryDict: {'username': ['dasdas']} > res = json.loads(request.body.decode('utf-8')) print(res,type(res)) for k,v in res.items(): params[k] = v request.POST = params # print(request.POST) def process_response(self,request,response): print('我是第一個自定義的中間件中process_response方法') return response