Flask - 使用相同名称覆盖图像并显示新图像
Posted
技术标签:
【中文标题】Flask - 使用相同名称覆盖图像并显示新图像【英文标题】:Flask - Overwrite image using same name and display the new image 【发布时间】:2021-02-04 23:16:14 【问题描述】:我创建了一个小flask网站,有2个功能:上传图片并在网站上展示。
网站总是以相同的名称image.png
保存新上传的图片,以替换之前上传的图片。当我上传一个新文件时,它会成功替换static/img
目录中的旧文件。但是,该网站继续显示旧图像。
我在 *** 上能找到的最接近的问题是 Overwriting Image with same name - Django。这里的答案建议使用信号,但没有解释为什么会这样。如果可能的话,我希望有人能澄清我做错了什么。
如何确保显示新上传的图片?
您可以使用以下信息重现我的情况。
目录结构
├── main.py
├── static
│ └── img
│ └── image.png
└── templates
└── index.html
main.py
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)
index.html
<!-- Display Image -->
% if filename %
<img src=" url_for('display_img', filename=filename) " >
% 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>
【问题讨论】:
这听起来像是缓存控制问题。查看this post 以获得一些指导。您还可以尝试在display_img
内使用return redirect(url_for('static', filename='img/' + filename), code=307)
重定向307
。
@Abdou 谢谢!我禁用了烧瓶上的缓存,它起作用了!
【参考方案1】:
我有一个类似但略有不同的问题 - 当我覆盖我的 HTML 模板时,旧模板仍在显示。 在 app.config 中将 TEMPLATES_AUTO_RELOAD 设置为 True 解决了这个问题。
app.config['TEMPLATES_AUTO_RELOAD'] = True
【讨论】:
【参考方案2】:正如@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)
【讨论】:
以上是关于Flask - 使用相同名称覆盖图像并显示新图像的主要内容,如果未能解决你的问题,请参考以下文章
在同一个 UIImageView 中加载多个图像会在显示新图像之前闪烁最后一个图像
如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()