• form表单提交与ajax消息传递


    form表单提交与ajax消息传递

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

           urlencoded
            
              对应的数据格式:name=xxx&password=666
              后端获取数据:request.POST
               ps;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:'',  // 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.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')
    

    6.form表单

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

    七Django默认有七个中间件

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

    中间件可以定义五个方法,分别是:(主要的是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
    
    
    
  • 相关阅读:
    mysql 45讲 索引的使用 09-11
    mysql 45讲 相关锁的概念 06-08
    mysql 45讲 深入浅出索引04-05
    mysql 45讲 概览 01-03
    AQS源码解析第二回
    面试相关-怎么实现限流功能
    人工智能必备数学基础:线性代数基础(2)
    Elasticsearch问题总结和解决方法
    spring boot中打印所有日志
    Java中Stream流里面的findFirst()和findAny()区别
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11437167.html
Copyright © 2020-2023  润新知