• ajax和form和七个中间件


    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
                   
           
  • 相关阅读:
    vue2.0 之 douban (二)创建自定义组件tabbar
    vue2.0 之 douban (一)框架搭建 及 整体布局
    react-navigation
    react-native modal
    javascript-使用el表达式获取后台传递的数据
    java Map
    java List集合
    javascript 自定义Map
    javascript Array(数组)
    ZOJ 3868 GCD Expectation (容斥+莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11444920.html
Copyright © 2020-2023  润新知