• 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>
  • 相关阅读:
    超级楼梯
    hdu1040
    hdu2033(惭愧)
    hdu2032杨辉三角
    hdu1013Digital Roots
    hdu2031
    Linux信号(signal) 机制分析
    android init重启service(进程)
    [android] init进程 .rc文件中service、action的parsing
    oom_adj
  • 原文地址:https://www.cnblogs.com/Caesary/p/5910136.html
Copyright © 2020-2023  润新知