ajax和form表单,django的中间件

1.前后端传输编码格式contentType:

urlencoded:

对应的数据格式:name=XXX&password=66

后端获取数据:request.POST

django会将urlencoded编码的数据解析自动放到request.POST

formdata:

form表单传输文件的编码格式

后端获取文件格式数据:request.FILES

后端获取普通键值对数据:request.POST

application/json

ajax发送json格式数据

需要注意的点

编码与数据格式要一致

2.form表单和ajax的异同点:

1)form表单不支持异步提交局部刷新

2)form表单不支持传输json格式的数据

3)form表单也ajax默认传输数据的编码格式都是urlencoded

3.ajax传输普通数据

<!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>

4.ajax传文件数据

<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>

5.ajax传json数据

<script>

   $('d1').click(function() {
       $.ajax({
           url:'',
           type:'POST',
           contentType:'application/json',
           data:Json.stringify({'name':'nick','hobby':'study'}),
           success:function(data) {
               alert(data)
          }
      })
  })
</script>

后台

import json
from django.http import JsonResponse
def ajax_json(request):
   if request.mrthod == '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')

6.form表单

<h1>
  form_up
</h1>

<form action="" method="POST" enctpe="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')

DJango默认有七个中间件,但是django暴露给用户可以自定义中间件并且里面可以写5种方法

有response需要加上ruturn

process_request(self,request)

process_response(self,request,response)

process_view(se;f,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(midelewareMixin):
   def process_request(self,request):
       print('我是第一个自定义的中间件中procsee_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(MiddlewareMinxin):
   def procsee_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:
               #网页打印结果<Query:{'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
               
       

猜你喜欢

转载自www.cnblogs.com/zrx19960128/p/11438322.html