首页 > 解决方案 > Flask - 使用相同名称覆盖图像并显示新图像

问题描述

我创建了一个小flask网站,有2个功能:上传图片并显示在网站上。

该网站始终以相同的名称保存新上传的图像image.png,以替换之前上传的图像。当我上传新文件时,它会成功替换static/img目录中的旧文件。但是,该网站继续显示旧图像。

我在 stackoverflow 上能找到的最接近的问题是 Overwriting Image with same name - Django。这里的答案建议使用信号,但没有解释为什么会这样。如果可能的话,我希望有人能澄清我做错了什么。

我该怎么做才能确保显示新上传的图像?

您可以使用以下信息重现我的情况。

目录结构

├── main.py
├── static
│   └── img
│       └── image.png
└── templates
    └── index.html

主文件

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

app = Flask(__name__)

app.config['UPLOAD_FOLDER'] = 'static/img/'

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        file = request.files['image'] 
        filename = "image.png"
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return render_template('index.html', filename=filename)
    else:
        return render_template('index.html')

@app.route('/<filename>')
def display_img(filename):
    """Display image on website"""
    return redirect(url_for('static', filename='img/' + filename))

if __name__ == "__main__":
    app.run(debug=True)

索引.html

<!-- Display Image -->
{% if filename %}
    <img src="{{ url_for('display_img', filename=filename) }}" alt="alt">
{% endif %}

<!-- Upload Image Button -->
<form action="#", method="POST", enctype=multipart/form-data>
    <input type="file" name="image" id="image"/>
    <button type="submit" value="Submit">Submit</button>
</form>

标签: pythonhtmlflaskjinja2overwrite

解决方案


正如@Abdou 在上面的评论中提到的那样,该网站正在使用缓存的图像来继续显示旧图像。在大多数情况下可能不是最佳的,但对于这种情况,通过放在app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0顶部禁用缓存可以解决问题。

app = Flask(__name__)

app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

...

if __name__ == "__main__":
    app.run(debug=True)

推荐阅读