问题描述
我创建了一个具有两个功能的小型烧瓶网站:上传图片并将其显示在网站上。
网站始终以相同名称image.png
保存新上传的图像,以替换之前上传的图像。当我上载新文件时,它将成功替换static/img
目录中的旧文件。但是,该网站仍在显示旧图像。
我在stackoverflow上发现的最接近的问题是 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) }}" 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>
解决方法
就像@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)
,
我遇到了一个类似但略有不同的问题 - 当我覆盖 HTML 模板时,旧模板仍在显示。 在 app.config 中将 TEMPLATES_AUTO_RELOAD 设置为 True 解决了该问题。
app.config['TEMPLATES_AUTO_RELOAD'] = True