【问题标题】:Flask redirect doesn't work after upload上传后烧瓶重定向不起作用
【发布时间】:2014-10-14 07:39:15
【问题描述】:

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

@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')

编辑:不确定说我正在使用 DropzoneJS 是否会有所帮助。我认为默认情况下它使用 Ajax。或许与此有关?

【问题讨论】:

  • 您的重定向丢失了url_for。我猜blah 不是您的蓝图名称,所以我不确定这是否只是您创建此问题时的遗漏。
  • @dirn 在我的代码中。我的错误遗漏。
  • 你说当你删除线(并且只删除线)return redirect(url_for("blah.list_uploads"))时它不会阻塞一分钟?没有其他的?它看起来很明显,正好是一分钟。也许所有工作人员(或者更可能您只运行一个工作人员)都在忙于其他事情,例如长轮询 AJAX 调用。
  • 原谅我的无知。我将如何处理“长轮询”AJAX 调用?我现在在一个 EC2 节点上使用基本的 nginx 设置。即使工人很慢,它最终也应该重定向,对吧?
  • 发布你的 dropzone js 代码

标签: python flask dropzone.js


【解决方案1】:

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

【讨论】:

  • 感谢开源 flask-dropzone。非常全面的文档!
  • 如果可以闪现成功消息呢?
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多