xone

 

原生ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="button" value="Ajax" onclick="Ajax1();">

<script>
    function Ajax1() {
        var xhr = new XMLHttpRequest();
        xhr.open(\'POST\',\'/ajax_json/\',true);
        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                // 接收完毕
                var obj = JSON.parse(xhr.responseText);
                console.log(obj);
            }
        };
        xhr.setRequestHeader(\'k1\',\'v1\');
        xhr.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded; charset-UTF-8\');    #原生ajax要设置请求头才能发送数据
        xhr.send(\'name=root;pwd=123\');
    }
</script>

</body>
</html>

“伪”Ajax

由于HTML标签的iframe标签具有局部加载内容的特性,所以可以使用其来伪造Ajax请求。

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="text" name="email">
<form action="/ajax_json/" method="POST" target="ifm1">
    <iframe name="ifm1"></iframe>
    <input type="text" name="user">
    <input type="text" name="email">
    <input type="submit" value="iframe">
</form>

</body>
</html>

视图函数

def ajax_json(request):

    ret = {
        \'status\':True,
        \'data\': None,
    }
    import json
    print(request.POST)
    return HttpResponse(json.dumps(ret),status=404,reason=\'Not Found\')  # status是返回的状态码,reason是返回的状态信息。

实例二:

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="text" name="email">
<form action="/ajax_json/" method="POST" target="ifm1">
    <iframe id="ifm1" name="ifm1"></iframe>
    <input type="text" name="user">
    <input type="text" name="email">
    <input id=\'submit\' type="submit" value="iframe">
</form>

    $(\'#submit\').click(function () {
        $(\'#ifm1\').load(function () {  # 当页面加载完成后执行
            var text = $(this).contents().find(\'body\').text();  # 获取iframe中的内容(即服务器端返回的数据)
            var obj = JSON.parse(text);
            console.log(obj)
        })
    })

</script>

</body>
</html>

 

视图函数

def ajax_json(request):

    ret = {
        \'status\':True,
        \'data\': None,
    }
    import json
    print(request.POST)
    return HttpResponse(json.dumps(ret))

 

jQuery的Ajax

        $.ajax({
            url: \'/host\',
            type: "POST",
            data: {\'k1\': 123,\'k2\': "root"},  //提交的数据
            success: function(return_data){
                // return_data是服务器端返回的字符串
                var obj = JSON.parse(return_data);
            }
        })

建议:永远让服务器端返回一个字典
return HttpResponse(json.dumps(字典))

格式

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        $(function () {
            $(\'#ajax_submit\').click(function () {

                $.ajax({
                    url:\'/test_ajax\',
                    type:\'POST\',
                    data:{\'hostname\':$(\'#hostname\').val(),\'ip\':$(\'#ip\').val(),\'port\':$(\'#port\').val(),\'b_id\':$(\'#b_id\').val()},
            dataType:JSON,   //对views返回的数据return_data,执行JSON.parse(return_data),也就是下面的obj
            traditional:true //设置此参数后,data的value值可以为列表。
                    success:function (obj) {  //执行成功后,这里必须有参数,服务器端返回的数据放在obj里
              if (obj.status){
                            location.reload()   //刷新当前页面
                  location.href = \'/host\'  //跳转到/host这个地址
                        }else {
                            alert(obj.error)
                        }
                    }
            error:function(){  //发生未知错误会执行,服务端返回的错误不算。
                    }
                    })
            })
        })
    </script>

 

obj = JSON.parse(return_data)  # 字符串转换成对象

str = JSON.stringify(obj)  # 对象转换成字符串

实例:

视图函数

def test_ajax(request):
    import json
    ret = {\'status\':True,\'error\':None,\'data\':None}   # 让服务器返回一个字典
    try:
        h = request.POST.get(\'hostname\')
        i = request.POST.get(\'ip\')
        p = request.POST.get(\'port\')
        b = request.POST.get(\'b_id\')

        if h and len(h) >5:
            models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
            return HttpResponse(json.dumps(ret))
        else:
            ret[\'status\'] = False
            ret[\'error\'] = \'太短了\'
            return HttpResponse(json.dumps(ret))   # HttpResponse只能返回字符串,所以这里要用json.dumps(ret),将字典转成字符串。
    except Exception as e:
        ret[\'status\'] = False
        ret[\'error\'] = \'请求错误\'
        return HttpResponse(json.dumps(ret))

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <form id="addform" action="/edit_app" method="POST">
        <p><input name="id" value="{{ app_obj.id }}" style="display: none"></p>
        <p><input id="app" type="text"  name="app" value="{{ app_obj.name }}" ></p>

        <select id="host" name="host" multiple>
            {% for i in host_obj %}
                <option value=\'{{ i.id }}\'>{{ i }}</option>
            {% endfor %}
        </select>
        <p><input type="submit" value="提交"></p>
        <p id="ajax_submit">悄悄提交</p>
    </form>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        $(function () {
            $(\'#host\').val({{ host_list }});
            $(\'#ajax_submit\').click(function () {

                $.ajax({
                    url:\'/app_add_ajax\',
                    type:\'POST\',
                    data:$(\'#addform\').serialize(), //获取表单里的数据
                    dataType: JSON,
                    traditional: true,
                    success:function (obj) {
                        if (obj.status){
                            console.log(obj);
                            location.reload()
                        }else {
                            console.log(obj.error)
                        }
                    },
                    error:function () {     //发生未知错误会执行

                    }
                    })
            })
        })
    </script>
</body>
</html>

应用场景:

如果发送的是普通数据推荐顺序:jQuery > XMLHttpRequest > iframe

 

文件上传的三种方式:

前端文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .d1{
            width: 200px;
            height: 100px;
            position: relative;

        }
        .c1{
            width: 200px;
            height: 100px;
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            z-index: 100;
            opacity: 0;
        }
        .c2{
            width: 200px;
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            background-color: #e0ffef;
            z-index: 90;
        }

    </style>

</head>
<body>

    <div class="d1">
        <input id="fafafa" class="c1" type="file" name="file1">
        <input class="c2" type="button" value="上传">
    </div>
    // XHR方式上传文件
    <input class="c3" type="button" value="提交XHR" onclick="xhrSubmit();">
    
    // jQuery方式上传文件
    <input class="c3" type="button" value="提交jQuery" onclick="jQuerySubmit();">

    // iframe方式上传文件
    <form id="form1" action="/upload/" method="POST" enctype="multipart/form-data" target="ifm1">
        <iframe id="ifm1" name="ifm1" style="display: none"></iframe>
        <input id="file" type="file" name="fafafa" onchange="changeUpload();">
        <input id="iframe1" type="submit" value="提交iframe" onclick="iframeSubmit();">
        <div id="preview"></div>

    </form>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
    
    // XHR方式上传文件    
        function xhrSubmit() {
            var file_obj = document.getElementById(\'fafafa\').files[0];

            var fd = new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);

            var xhr = new XMLHttpRequest();
            xhr.open(\'POST\',\'/upload/\',true);
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4){
                    var obj = JSON.parse(xhr.responseText);
                    console.log(obj);
                }
            };
            xhr.send(fd);
        }
        
    // jQuery方式上传文件
        function jQuerySubmit(){
            var fileObj = $("#fafafa")[0].files[0];
            var fd = new FormData();
            fd.append(\'username\',\'root\');
            fd.append("fafafa", fileObj);

            $.ajax({
                type:\'POST\',
                url: \'/upload/\',
                data: fd,
                processData: false,  // tell jQuery not to process the data
                contentType: false,  // tell jQuery not to set contentType
                success: function(arg1,arg2,arg3){
                    console.log(arg1);  // 服务器端返回的数据
                    console.log(arg2);  // success
                    console.log(arg3);  // 服务器端返回的XML对象
                }
            });
        }
        
    // iframe方式上传文件
        function iframeSubmit() {
            $(\'#ifm1\').load(function () {
                var text = $(this).contents().find(\'body\').text();
                var obj = JSON.parse(text);
                console.log(obj);
                $(\'#preview\').empty();
                var imgTag = document.createElement(\'img\');
                imgTag.src = \'/\' + obj.data;
                $(\'#preview\').append(imgTag)
            });
        }
        
    // iframe方式上传图片,含有预览功能
        function changeUpload() {
            $(\'#ifm1\').load(function () {
                var text = $(this).contents().find(\'body\').text();
                var obj = JSON.parse(text);
                console.log(obj);
                $(\'#preview\').empty();      // 显示前对页面进行清空
                var imgTag = document.createElement(\'img\');
                imgTag.src = \'/\' + obj.data;  // 前端显示的时候需要加入需要在文件的路径前面加/
                $(\'#preview\').append(imgTag)
            });
            $(\'#form1\').submit();
        }

    </script>

</body>
</html>

 

视图函数

def upload(request):
    ret = {
        \'status\': True,
        \'data\': None,
    }

    if request.method == \'POST\':
        username = request.POST.get(\'username\')
        fafafa = request.FILES.get(\'fafafa\')
        print(username,fafafa)

        import os
        img_path = os.path.join(\'static/imgs/\',fafafa.name)
        with open(img_path, \'wb\') as f:
            for item in fafafa.chunks():
                f.write(item)

        ret[\'data\'] = img_path
        return HttpResponse(json.dumps(ret))
    else:
        return render(request,\'uploads.html\')

 

分类:

技术点:

相关文章: