• django--ajax


    Ajax:是一个js的技术,发送请求的一种途径

        特性:
        1.局部刷新
        2.异步
        3.传输的数据量小

    简单实例:

    1.不刷新页面去实现input框的计算(异步的实现)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>index</h1>
    {% csrf_token %}
    
    <input type="text" name="i1">
    +
    <input type="text" name="i2">
    =
    <input type="text" name="i3">
    
    <button id="b1">计算</button>
    
    <hr>
    <input type="text" name="i4">
    +
    <input type="text" name="i5">
    =
    <input type="text" name="i6">
    
    <button id="b2">计算</button>
    
    
    
    <script src="/static/jquery.js"></script>
    
    <script>
        $('#b1').click(function () {
            $.ajax(
                {
                    url: '/add/',
                    type: 'post',
                    data: {
                        'i1': $('[name="i1"]').val(),
                        'i2': $('[name="i2"]').val(),
                    },
                    success: function (data) {
                        $('[name="i3"]').val(data)
                    },
                }
            )
        });
        $('#b2').click(function () {
            $.ajax(
                {
                    url: '/add1/',
                    type: 'post',
                    data: {
                        'i1': $('[name="i4"]').val(),
                        'i2': $('[name="i5"]').val(),
                    },
                    success: function (data) {
                        $('[name="i6"]').val(data)
                    },
                }
            )
        });
    
    </script>
    </body>
    </html>
    html文件
        url(r'^index/', views.index),
        url(r'^add/', views.add),
        url(r'^add1/', views.add1),
    url.py
    def index(request):
        return render(request,'index.html')
    import time
    def add(request):
        i1=request.POST.get('i1')
        i2=request.POST.get('i2')
    
        i3=int(i1)+int(i2)
        time.sleep(60)#测试异步
        return HttpResponse(i3)
    
    def add1(request):
        i1=request.POST.get('i1')
        i2=request.POST.get('i2')
    
        i3=int(i1)+int(i2)
        return HttpResponse(i3)
    view.py

    总结:

    html页面要想提交post请求,必须加{% csrf-token %}或者在index函数加ensure_csrf_cookie装饰器,确保设置的cooki的csrftoken
    
    Ajan请求的格式:
    
    $('#b1').click(function(){
        $.ajax(
        {
            url:'/add/',//处理请求的地址
            type:'post',//处理请求的方式
            data:{        //获得请求的数据
                'i1':$('[name="i1"]').val(),
                'i2':$('[name="i2"]').val()
            }
            success:function(res){//view处理成功后返回的结果,可以为Httpresponse对象(那么res为字符串),也可以为Jsonreaponse(那么res会转化为原格式的数据)
                console.log(res)
            }
            error:function(res){//view处理失败返回的结果
                consoloe.log(res)
            }
        }
        
        )
    }
    )

    2.上传文件//测试ajax传输的数据的实例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>index</h1>
    {% csrf_token %}
    
    <button id="b3">参数测试</button>
    <hr>
    <input type="file" name="f1"><button id="b4">上传</button>
    
    
    <script src="/static/jquery.js"></script>
    
    <script>
           $('#b3').click(function () {
            $.ajax(
                {
                    url: '/test/',
                    type: 'post',
                    data: {
                        'name': 'alex',
                        'hobby': JSON.stringify(['抽烟', '喝酒'])
                    },
                    success: function (res) {
                        console.log(res)
                    },
                    error: function (res) {
                        console.log(res)
                    }
    
                }
            )
        });
        $('#b4').click(function () {
            var file_obj=new FormData();//得到一个formdata对象
            file_obj.append('fi',$('[name="f1"]')[0].files[0]);//给对象添加键值对
    
            //写ajax请求
            $.ajax(
                {
                    url:'/upload/',//ajax交给的url地址
                    type:'post',//提交的方式
                    data:file_obj,//提交的数据
                    contentType:false,//不处理提交的contenttyle的请求头
                    processData:false,//不处理编码方式
                    success:function (res) {//处理成功后执行的代码,res为view处理完成后的返回值
                        console.log(res)
                    }
                }
            )
    
    
        })
    
    </script>
    </body>
    </html>
    html代码
        url(r'^test/', views.test),
        url(r'^upload/', views.upload),
    urls.py
    import json
    
    
    def test(request):
        print(request.POST)
    
        # return HttpResponse('ok')
        # int('s')
        hooby = request.POST.get('hobby')
        print(hooby, type(hooby))  # ["抽烟","喝酒"] <class 'str'>
    
        hooby = json.loads(hooby)
        print(hooby, type(hooby))  # ['抽烟', '喝酒'] <class 'list'>
    
        return JsonResponse({'status': 0, 'data': 'ok'})
    
    
    def upload(request):
        fi = request.FILES.get('fi')  # 获得file对象 f1
        with open(fi.name, 'wb')as f:
            for chunk in fi.chunks():
                f.write(chunk)
        # print(name,type(name))3黄韶华实习简历.pdf <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        # print(name.chunks)#chunks是一个绑定方法
    
        return HttpResponse('ok')
    views.py

    3.ajax通过csrf校验的方式

    方式一:在data中添加csrfmiddlewaretoken的隐藏狂的键值

    //前提是必须有{%  csrf-token %}
        $('#b1').click(function () {
            $.ajax(
                {
                    url: '/add/',
                    type: 'post',
                    data: {
                        'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val(),//方式一直接往data里面添加隐藏的input框的csrfmiddlewaretoken的值去校验
                        'i1': $('[name="i1"]').val(),
                        'i2': $('[name="i2"]').val(),
                    },
                    success: function (data) {
                        $('[name="i3"]').val(data)
                    },
                }
            )
        });

    方式二:在请求头headers添加x-csrftoken

        $('#b2').click(function () {
            $.ajax(
                {
                    url: '/add1/',
                    type: 'post',
                    headers:{
                        'x-csrftoken':$('[name="csrfmiddlewaretoken"]').val(),//方式二,往headers里面添加x-csrf-token的键值
                    },
                    data: {
                        'i1': $('[name="i4"]').val(),
                        'i2': $('[name="i5"]').val(),
                    },
                    success: function (data) {
                        $('[name="i6"]').val(data)
                    },
                }
            )
        });

    方式三:

    直接写一个setupajax文件,====基于x-csrftoken方式,为每一个ajan请求设置x-csrftoken

    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
    
    
    function csrfSafeMethod(method) {
      // these HTTP methods do not require CSRF protection
      return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    
    $.ajaxSetup({
      beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });
    代码

    引入方式:先引入jquery,在引入setupajax文件

    <script src="/static/jquery.js"></script>
    <script src="/static/ajax_setup.js"></script>

    {csrf-token}确保该地址有一个csrfmiddlewaretoken去通过校验,如果不想每次都在页面写可以引入一个装饰器ensure_csrf_cookie,确保每次访问的时候cookie都别带csrftoken

    from django.views.decorators.csrf import ensure_csrf_cookie
    
    
    @ensure_csrf_cookie
    def index(request):
        return render(request, 'index.html')
  • 相关阅读:
    html 3
    html标签2
    html标签
    2017.4.27
    2017.4.26
    2017.4.25
    2017.4.20
    2017.1.18
    2017.4.17
    2017.4.16.
  • 原文地址:https://www.cnblogs.com/liuer-mihou/p/10698822.html
Copyright © 2020-2023  润新知