zoukankan      html  css  js  c++  java
  • 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
                   
           
  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11438322.html
Copyright © 2011-2022 走看看