上传后,Flask重定向不起作用

时间:2014-08-20 19:54:14

标签: python flask dropzone.js

我基本上想在上传后转到其他页面。这里发生的是文件很快上传并保存在服务器上,但之后客户端(我的浏览器)每次都处于等待阶段一分钟,并且在等待之后甚至没有重定向。如果我删除它,我没有按预期得到任何回复,一切都在几毫秒内发生。

@blah.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'file' in request.files:
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            file.save(os.path.join('./tmp/uploads', filename))
            print '%s file saved' % filename

            return redirect(url_for("blah.list_uploads"))  
    return render_template('blah/upload.html')

enter image description here

编辑:不确定是否有助于说我使用DropzoneJS。我认为默认情况下它使用Ajax。也许它有什么关系呢?

2 个答案:

答案 0 :(得分:0)

在这一行:

if request.method == 'POST' and 'file' in request.files:

如果request.files中存在文件,那么总是“if file:”返回True。 这个代码始终在任何地方运行:

filename = secure_filename(file.filename)
file.save(os.path.join('./tmp/uploads', filename))
print '%s file saved' % filename

return redirect(url_for("blah.list_uploads"))

答案 1 :(得分:0)

更新:现在您可以使用Flask-Dropzone,这是一个将Dropzone.js与Flask集成的Flask扩展程序。对于此问题,您可以在上传完成时将DROPZONE_REDIRECT_VIEW设置为要重定向的视图。

Dropzone控制上传过程,因此你必须使用Dropzone重定向(确保加载了jQuery)。
创建一个事件监听器,当队列中的所有文件完成上传时,它将重定向页面:

<form action="{{ url_for('upload') }}" class="dropzone" id="my-dropzone" method="POST" enctype="multipart/form-data">
</form>

<script src="{{ url_for('static', filename='js/dropzone.js') }}"></script>
<script src="{{ url_for('static', filename='js/jquery.js') }}"></script>

<script>
Dropzone.autoDiscover = false;

$(function() {
  var myDropzone = new Dropzone("#my-dropzone");
  myDropzone.on("queuecomplete", function(file) {
    // Called when all files in the queue finish uploading.
    window.location = "{{ url_for('upload') }}";
  });
})
</script>

处理视图功能中的重定向:

import os
from flask import Flask, render_template, request

app = Flask(__name__)
app.config['UPLOADED_PATH'] = os.getcwd() + '/upload'

@app.route('/')
def index():
    # render upload page
    return render_template('index.html')


@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        for f in request.files.getlist('file'):
            f.save(os.path.join(app.config['UPLOADED_PATH'], f.filename))
    return redirect(url_for('where to redirect'))