Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法重定向到flask中的url_Python_Flask - Fatal编程技术网

Python 无法重定向到flask中的url

Python 无法重定向到flask中的url,python,flask,Python,Flask,我无法重定向到main.demo。一切正常,直到数据上传后,重定向没有发生。为什么? 编辑:app.py from flask import Blueprint main = Blueprint('main', __name__) import json import os from flask import Flask, request,render_template,url_for,redirect from werkzeug import secure_filename import g

我无法重定向到
main.demo
。一切正常,直到数据上传后,重定向没有发生。为什么?

编辑:
app.py

from flask import Blueprint
main = Blueprint('main', __name__)
import json
import os
from flask import Flask, request,render_template,url_for,redirect
from werkzeug import secure_filename

import glob2
from uuid import uuid4



@main.route('/')
def index():
    """Main index page """
    return render_template('index.html')

@main.route('/upload', methods=["GET","POST"])
def upload():
    if request.method == 'POST':
        form = request.form
        # Create a unique "session ID" for this particular batch of uploads.
        upload_key = str(uuid4())

        # Is the upload using Ajax, or a direct POST by the form?
        is_ajax = False
        if form.get("__ajax", None) == "true":
            is_ajax = True

        # Target folder for these uploads.
        target = "upload/{}".format(upload_key)
        try:
            os.mkdir(target)
        except:
            if is_ajax:
                return ajax_response(False, "Couldn't create upload directory: {}".format(target))
            else:
                return "Couldn't create upload directory: {}".format(target)

        print "=== Form Data ==="
        for key, value in form.items():
            print key, "=>", value

        for upload in request.files.getlist("file"):
            filename = upload.filename.rsplit("/")[0]
            destination = "/".join([target, filename])
            print "Accept incoming file:", filename
            print "Save it to:", destination
            upload.save(destination)
        return redirect(url_for("main.demo"))
    return render_template("upload.html")


@main.route('/demo',methods=["GET","POST"])
def demo():
    if request.method == "GET":
       return render_template("demo.html")

def ajax_response(status, msg):
    status_code = "ok" if status else "error"
    return json.dumps(dict(
        status=status_code,
        msg=msg,
    ))

def create_app():
    global app
    app = Flask(__name__,template_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)),'templates'))
    app.debug = True
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    app.register_blueprint(main)
    #app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
    return app
以下是我得到的一些日志:

=== Form Data ===
__ajax => true
Accept incoming file: demo.txt
Save it to: upload/XXXXXXX-XXXXXX-XXXXX-XXXXXXX/demo.txt
"POST /upload HTTP/1.1" 302 231 "http://localhost:5000/upload" 

"GET /demo HTTP/1.1" 200 3624 "http://localhost:5000/upload" 
这表明它将用于演示,但最终的url是错误的。为什么会这样

编辑1:

是否因为页面没有刷新,我无法提交表单?但是它会被重定向到
demo()
函数执行它,但不会
呈现模板。或者它确实如此,但不知何故又回到了相同的功能

编辑2:

添加此代码的更多内容是在后台使用以下
JavaScript

// Constants
var MAX_UPLOAD_FILE_SIZE = 1024*1024; // 1 MB
var UPLOAD_URL = "/upload";
var NEXT_URL   = "/demo";

// List of pending files to handle when the Upload button is finally clicked.
var PENDING_FILES  = [];


$(document).ready(function() {
    // Set up the drag/drop zone.
    initDropbox();

    // Set up the handler for the file input box.
    $("#file-picker").on("change", function() {
        handleFiles(this.files);
    });

    // Handle the submit button.
    $("#upload-button").on("click", function(e) {
        // If the user has JS disabled, none of this code is running but the
        // file multi-upload input box should still work. In this case they'll
        // just POST to the upload endpoint directly. However, with JS we'll do
        // the POST using ajax and then redirect them ourself when done.
        e.preventDefault();
        doUpload();
    })
});


function doUpload() {
    $("#progress").show();
    var $progressBar   = $("#progress-bar");

    // Gray out the form.
    $("#upload-form :input").attr("disabled", "disabled");

    // Initialize the progress bar.
    $progressBar.css({"width": "0%"});

    // Collect the form data.
    fd = collectFormData();

    // Attach the files.
    for (var i = 0, ie = PENDING_FILES.length; i < ie; i++) {
        // Collect the other form data.
        fd.append("file", PENDING_FILES[i]);
    }

    // Inform the back-end that we're doing this over ajax.
    fd.append("__ajax", "true");

    var xhr = $.ajax({
        xhr: function() {
            var xhrobj = $.ajaxSettings.xhr();
            if (xhrobj.upload) {
                xhrobj.upload.addEventListener("progress", function(event) {
                    var percent = 0;
                    var position = event.loaded || event.position;
                    var total    = event.total;
                    if (event.lengthComputable) {
                        percent = Math.ceil(position / total * 100);
                    }

                    // Set the progress bar.
                    $progressBar.css({"width": percent + "%"});
                    $progressBar.text(percent + "%");
                }, false)
            }
            return xhrobj;
        },
        url: UPLOAD_URL,
        method: "POST",
        contentType: false,
        processData: false,
        cache: false,
        data: fd,
        success: function(data) {
            $progressBar.css({"width": "100%"});
            data = JSON.parse(data);

            // How'd it go?
            if (data.status === "error") {
                // Uh-oh.
                window.alert(data.msg);
                $("#upload-form :input").removeAttr("disabled");
                return;
            }
            else {
                // Ok! Get the UUID.
                var uuid = data.msg;
                //window.location = NEXT_URL + uuid;
                window.location = NEXT_URL;
            }
        },
    });
}


function collectFormData() {
    // Go through all the form fields and collect their names/values.
    var fd = new FormData();

    $("#upload-form :input").each(function() {
        var $this = $(this);
        var name  = $this.attr("name");
        var type  = $this.attr("type") || "";
        var value = $this.val();

        // No name = no care.
        if (name === undefined) {
            return;
        }

        // Skip the file upload box for now.
        if (type === "file") {
            return;
        }

        // Checkboxes? Only add their value if they're checked.
        if (type === "checkbox" || type === "radio") {
            if (!$this.is(":checked")) {
                return;
            }
        }

        fd.append(name, value);
    });

    return fd;
}


function handleFiles(files) {
    // Add them to the pending files list.
    for (var i = 0, ie = files.length; i < ie; i++) {
        PENDING_FILES.push(files[i]);
    }
}


function initDropbox() {
    var $dropbox = $("#dropbox");

    // On drag enter...
    $dropbox.on("dragenter", function(e) {
        e.stopPropagation();
        e.preventDefault();
        $(this).addClass("active");
    });

    // On drag over...
    $dropbox.on("dragover", function(e) {
        e.stopPropagation();
        e.preventDefault();
    });

    // On drop...
    $dropbox.on("drop", function(e) {
        e.preventDefault();
        $(this).removeClass("active");

        // Get the files.
        var files = e.originalEvent.dataTransfer.files;
        handleFiles(files);

        // Update the display to acknowledge the number of pending files.
        $dropbox.text(PENDING_FILES.length + " files ready for upload!");
    });

    // If the files are dropped outside of the drop zone, the browser will
    // redirect to show the files in the window. To avoid that we can prevent
    // the 'drop' event on the document.
    function stopDefault(e) {
        e.stopPropagation();
        e.preventDefault();
    }
    $(document).on("dragenter", stopDefault);
    $(document).on("dragover", stopDefault);
    $(document).on("drop", stopDefault);
}
//常数
var MAX_UPLOAD_FILE_SIZE=1024*1024;//1 MB
var UPLOAD_URL=“/UPLOAD”;
var NEXT_URL=“/demo”;
//最后单击上载按钮时要处理的挂起文件列表。
var PENDING_FILES=[];
$(文档).ready(函数(){
//设置拖放区域。
initDropbox();
//设置文件输入框的处理程序。
$(“#文件选择器”)。在(“更改”,函数()上{
handleFiles(this.files);
});
//处理提交按钮。
$(“#上载按钮”)。在(“单击”上,功能(e){
//如果用户禁用了JS,则除了
//“文件多上传”输入框仍应工作。在这种情况下,它们将
//只需直接发布到上传端点。但是,使用JS我们就可以了
//使用ajax发布文章,然后在完成后自行重定向。
e、 预防默认值();
双倍体();
})
});
函数doUpload(){
$(“#进度”).show();
var$progressBar=$(“#进度条”);
//把表格涂成灰色。
$(“#上传表单:输入”).attr(“禁用”、“禁用”);
//初始化进度条。
$progressBar.css({“宽度”:“0%”);
//收集表单数据。
fd=collectFormData();
//附上文件。
对于(var i=0,ie=PENDING_FILES.length;i
我已尝试从以下链接集成功能:

无法理解
if is_ajax:
    return ajax_response(True, upload_key)
else:
    return redirect(url_for("main.demo"))