Flask重定向在上传后无效

6 投票
1 回答
3765 浏览
提问于 2025-04-18 17:58

我基本上想在上传文件后跳转到另一个页面。现在的情况是,文件上传得很快并且保存在服务器上,但之后我的浏览器会在“等待”状态下停留一分钟,而且等了这么久也没有跳转。如果我把这个过程去掉,就不会得到任何预期的响应,所有操作都是在毫秒内完成的。

@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的。也许这和它有关系?

1 个回答

3

更新: 现在你可以使用 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'))

撰写回答