python周报第二十一周

0.本周知识点预览

  • Django Form文件上传
  • 原生Ajax
  • Ajax 文件上传
  • iframe 文件上传

1.Django Form文件上传

前端代码:

{#        Form方式上传文件,注意method是POST,enctype的设置必不可少,不然只能传个文件名,不能传文件内容#}
    <form action="/upload/" method="POST" enctype="multipart/form-data">
        <input type="text" name="user"/>
        <input type="file" name="img"/>
        <input type="submit" name="submit"/>
    </form>

后端代码:

views.py

def upload(request):
    if request.method == "POST":
        user = request.POST.get("user")
        img = request.FILES.get("img")
        file_path = os.path.join("static", img.name)
        f = open(file_path, "wb")
     ##chunks方法是可迭代的,可以先看img的属性,然后找到类,找到该方法
for line in img.chunks(): f.write(line) f.close() return render(request, "upload.html")

2.原生Ajax

1.GET

 前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" name="abc"/>
    <input type="button" value="ajax提交" onclick="ajax1();"/>
    <script>
{#        get方式#}
        function ajax1(){
{#            初始化一个XMLHttpRequest对象,原生Ajax就是这么实现的#}
            var a = new XMLHttpRequest();
{#            定义一个回调函数#}
{#            当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState 改变时,就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。#}
            a.onreadystatechange = function () {
{#                0: 请求未初始化,1: 服务器连接已建立,2: 请求已接收,3: 请求处理中,4: 请求已完成,且响应已就绪#}
                if(a.readyState == 4){
                    console.log(a.responseText)
                }
            };
{#            open方法,定义请求类型,get,post等,第二个是url和请求参数#}
            a.open("GET", "/ajax_test/?p=123");
{#            send方法发送Ajax请求#}
            a.send();
        }

后端代码接收GET请求的p参数:

def ajax(request):

    return render(request, "ajax.html")

def ajax_test(request):
    a = request.GET.get("p")
    # a = request.POST.get("p")
    print(a)
    return HttpResponse("ok")

2.POST

前端代码:

        function ajax1(){
            var a = new XMLHttpRequest();
            a.onreadystatechange = function () {
                if(a.readyState == 4){
                    console.log(a.responseText)
                }
            };
{#            POST的时候无需写参数,只写url后边要带杠,#}
            a.open("POST", "/ajax_test/");
{#            需要设置POST请求头#}
            a.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
            a.send("p=123");
        }

后端代码:

def ajax(request):

    return render(request, "ajax.html")

def ajax_test(request):
    # a = request.GET.get("p")
    a = request.POST.get("p")
    print(a)
    return HttpResponse("ok")

3.FORM

前端代码:

        function ajax1(){
            var a = new XMLHttpRequest();
            a.onreadystatechange = function () {
                if(a.readyState == 4){
                    console.log(a.responseText)
                }
            };
            a.open("POST", "/ajax_test/");
{#            这里不需要设置POST请求头了#}
            a.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
{#            这里是重点,新建个form对象#}
            var form = new FormData;
{#            把需要发送的数据追加到form里#}
            form.append("p", "123");
{#            直接发送form对象#}
            a.send(form);
        }

3.Ajax文件上传

1.Form对象上传

前端代码:

        Ajax方式上传文件
        <form action="/upload/" method="POST" enctype="multipart/form-data">
            <input type="text" name="user" id="user"/>
            <input type="file" name="img" id="img" value="ajax上传"/>
        </form>
        <a style="display: inline-block; background-color: red; color: bisque; cursor: pointer;" onclick="Ajax1();">XMLHttpRequest</a>
        <script>
            function Ajax1(){
{#                新建一个form对象#}
{#                把数据添加到form对象中#}
                var form = new FormData();
                form.append("user", document.getElementById("user").value);
{#                fileobj 是一个文件对象#}
                var fileobj = document.getElementById("img").files[0];
                form.append("img", fileobj);
{#                新建一个Ajax对象用来上传文件#}
                var aa = new XMLHttpRequest();
{#                回调函数,并判断哪种状态在打印数据,4代表数据完全传输完#}
                aa.onreadystatechange = function () {
                if(aa.readyState == 4){
                    console.log(aa.responseText)
                }
            };
{#                POST的方式传输,直接send一个form对象#}
                aa.open("post", "/upload/", true);
                aa.send(form);
            }
        </script>

2.Iframe 上传文件

{#        iframe方式上传文件,Iframe可以看做是一个能向后端传输数据的通道,可以把form提交到iframe里#}
        <script src="/static/js/jquery-1.12.4.js"></script>
        form提交表单通过iframe传到后台,把form的提交地址改成iframe的name属性
        <iframe id="my_iframe" name="my_iframe" style="display: none;"></iframe>
        <form id="fo" action="/upload/" method="POST" enctype="multipart/form-data">
            user测试页面是否刷新
            <input type="text" name="user" id="user"/>
            onchange事件是说input标签发生变化之后就会执行函数
            <input type="file" name="img" id="img" onchange="uploadFile3();"/>
        </form>
            用来预览上传的图片
        <div id="containter"></div>
        <script>
            function uploadFile3(){
                $("#containter").find("img").remove();
                onload等待iframe全部加载之后执行函数
                document.getElementById("my_iframe").onload = callback;
                //这个target加的是iframe的name属性
                document.getElementById("fo").target = "my_iframe";
                //DOM方式上传表单
                document.getElementById("fo").submit();
            }
            function callback(){
                //因为iframe嵌套有个#ducoment,所以要加content属性
                var text = $("#my_iframe").contents().find("body").text();
                var json_data = JSON.parse(text);
                console.log(json_data);
                if (json_data.status){
                    //上传成功
                    //预览,创建img标签,src属性指向上传后的服务器路径
                    var tag = document.createElement("img");
                    //拼接预览路径
                    tag.src = "/" + json_data.data;
                    tag.className = "img";
                    $("#containter").append(tag);
                }
                else {
                    alert(json_data.error);
                }
            }
        </script>
原文地址:https://www.cnblogs.com/Caesary/p/5910136.html