You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中render_template页面不更新:文件上传生成图片后页面未刷新

Flask文件上传后重定向页面未刷新问题

我实现了文件上传、生成图片后展示的功能,后端返回了正确的状态码:

"POST /result HTTP/1.1" 302 -
"GET /display_image/census_2009b.png HTTP/1.1" 200 -

但执行redirect后页面并未刷新跳转。

相关代码

Flask后端代码

from flask import Flask, request, render_template, send_file, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/result', methods=['GET', 'POST'])
def upload_file():
    file = request.files['file']
    ### 生成并保存图片至`filename`...

    return redirect(url_for('display_image', filename=filename))

@app.route('/display_image/<filename>', methods=['GET', 'POST'])
def display_image(filename):
    image_url = url_for('static', filename=filename)
    return render_template('display_image.html', image_url=image_url)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

index.html代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
        <link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
    </head>
    <body>
        <form action="/result" method="get" class="dropzone" id="my-dropzone"></form>
    </body>
</html>

display_image.html代码

<!DOCTYPE html>
<html>
<head>
    <title>Uploaded Image</title>
</head>
<body>
    <img src="{{ image_url }}" alt="Uploaded image">
</body>
</html>

问题原因

Dropzone默认采用AJAX异步方式上传文件,它会拦截表单的默认提交行为,并且不会自动处理后端返回的302重定向响应。虽然后台已经完成了重定向对应的请求,但浏览器页面不会触发跳转刷新。

另外注意:表单method设为get不符合文件上传的规范,文件上传必须用post,这也是一个潜在问题。

解决方案

方案1:关闭Dropzone的自动AJAX处理,恢复表单默认提交

修改index.html,添加Dropzone配置,禁用自动异步处理,让表单以传统方式提交:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
        <link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
        <script>
            Dropzone.options.myDropzone = {
                autoProcessQueue: false,
                init: function() {
                    // 添加上传按钮
                    var submitBtn = document.createElement("button");
                    submitBtn.textContent = "确认上传";
                    this.element.appendChild(submitBtn);
                    
                    var dropzone = this;
                    submitBtn.addEventListener("click", function() {
                        dropzone.processQueue();
                    });
                    
                    // 禁用AJAX,触发表单默认提交
                    this.on("sending", function(file, xhr, formData) {
                        this.element.submit();
                        return false; // 阻止Dropzone的异步请求
                    });
                }
            };
        </script>
    </head>
    <body>
        <!-- 修正method为POST,添加enctype属性 -->
        <form action="/result" method="POST" class="dropzone" id="my-dropzone" enctype="multipart/form-data"></form>
    </body>
</html>

方案2:在Dropzone成功回调中手动跳转页面

保持AJAX上传逻辑,在上传完成后通过JS手动触发页面跳转:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
        <link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
        <script>
            Dropzone.options.myDropzone = {
                url: "/result",
                method: "POST",
                success: function(file, response) {
                    // 这里直接跳转至图片展示页,可根据后端返回的filename动态拼接
                    window.location.href = `/display_image/${response.filename}`;
                }
            };
        </script>
    </head>
    <body>
        <form class="dropzone" id="my-dropzone" enctype="multipart/form-data"></form>
    </body>
</html>

同时需要修改后端接口,返回包含filename的JSON数据而非重定向:

from flask import jsonify

@app.route('/result', methods=['POST'])
def upload_file():
    file = request.files['file']
    ### 生成并保存图片至`filename`...

    return jsonify({"filename": filename})

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:48:26