
本教程详细介绍了如何在flask web应用中展示静态图片,并通过javascript实现图片的定时刷新,解决浏览器缓存问题。同时,文章还涵盖了如何在flask后端处理图片上传,并将其与前端展示及刷新机制相结合,提供了一个完整的图片管理与动态显示解决方案。
在Flask应用中展示静态图片是基础操作,通常涉及配置静态文件目录和在HTML模板中正确引用图片。
首先,我们需要一个Flask应用实例,并指定静态文件(如图片)的存放位置。通常,静态文件会放在项目根目录下的 static 文件夹中。
import os
from flask import Flask, render_template, url_for, flash, request, redirect
from werkzeug.utils import secure_filename
# 定义允许上传的文件扩展名
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
app = Flask(__name__)
# 配置上传文件夹,这里我们将图片保存在 static/images 目录下
app.config['UPLOAD_FOLDER'] = os.path.join('static', 'images')
# 设置一个用于演示的秘密密钥,用于flash消息
app.secret_key = 'super_secret_key'
# 用于存储当前显示的图片文件名,简单演示,生产环境应避免使用全局变量
current_display_image = 'chart.png' # 默认图片
@app.route("/")
def running():
return "<p>Website running!</p>"
# 检查文件是否允许上传
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/chart")
def show_img():
# 构造图片在静态目录下的相对路径
# user_image 变量将传递给模板,用于构建完整的图片URL
image_path_in_static = os.path.join('images', current_display_image)
return render_template("chart.html", user_image=image_path_in_static)
# ... (上传路由将在后续章节添加)
if __name__ == "__main__":
app.run(port=3000, debug=True) # 开启调试模式便于开发说明:
chart.html 模板将使用Flask的 url_for 函数来正确引用静态文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动态图片展示</title>
</head>
<body>
<h1>图片展示与刷新</h1>
<!-- 图片上传表单将在此处添加 -->
<br>
@@##@@
<script>
// JavaScript代码将在此处添加
</script>
</body>
</html>说明:
当图片文件名不变,但其内容在服务器端发生更新时,浏览器可能会因为缓存机制而继续显示旧图片。为了强制浏览器加载新图片,我们需要在图片URL中添加一个动态参数(通常是时间戳),使每次请求的URL都不同。
浏览器会缓存静态资源以提高加载速度。如果图片的URL没有改变,即使服务器上的图片内容已更新,浏览器也可能直接从缓存中读取旧图片。通过在URL后添加一个唯一的查询参数(如 ?timestamp=1678886400000),可以欺骗浏览器认为这是一个全新的资源,从而强制它重新下载。
在 chart.html 中添加以下JavaScript代码,实现每5秒刷新一次图片。
iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切
0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动态图片展示</title>
</head>
<body>
<h1>图片展示与刷新</h1>
<!-- 图片上传表单将在此处添加 -->
<br>
@@##@@
<script>
document.addEventListener('DOMContentLoaded', function() {
const dynamicImage = document.getElementById('dynamicImage');
const originalSrc = dynamicImage.src.split('?')[0]; // 获取不带查询参数的原始URL
setInterval(function() {
// 构建新的URL,添加当前时间戳作为查询参数,强制浏览器刷新
const newSrc = originalSrc + '?' + new Date().getTime();
dynamicImage.src = newSrc;
console.log('Image refreshed:', newSrc);
}, 5000); // 每5秒刷新一次
});
</script>
</body>
</html>说明:
为了让用户能够上传新的图片,我们需要在Flask后端添加一个文件上传路由,并在前端提供一个上传表单。
修改 app.py,添加 /upload 路由来处理文件上传。
import os
from flask import Flask, render_template, url_for, flash, request, redirect, current_app
from werkzeug.utils import secure_filename
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.path.join('static', 'images')
app.secret_key = 'super_secret_key'
current_display_image = 'chart.png' # 默认图片
@app.route("/")
def running():
return "<p>Website running!</p>"
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
global current_display_image # 声明使用全局变量
if request.method == 'POST':
# 检查请求中是否有文件部分
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
# 如果用户没有选择文件,浏览器会提交一个没有文件名的空文件
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
# 使用 secure_filename 确保文件名安全
filename = secure_filename(file.filename)
# 为了演示目的,我们总是将上传的图片保存为 'chart.png'
# 这样前端的刷新机制就能直接获取到更新后的图片
save_filename = 'chart.png'
file_path = os.path.join(app.config['UPLOAD_FOLDER'], save_filename)
# 如果文件已存在,先删除旧文件
if os.path.exists(file_path):
os.remove(file_path)
file.save(file_path)
current_display_image = save_filename # 更新当前显示的文件名
flash(f'File "{filename}" uploaded successfully as "{save_filename}"!')
# 上传成功后重定向到图片展示页面
return redirect(url_for('show_img'))
# GET请求时,重定向到图片展示页面,或者可以渲染一个上传表单页面
return redirect(url_for('show_img'))
@app.route("/chart")
def show_img():
# 使用 current_app.config 更具规范性,尤其是在蓝图或多线程环境中
# full_filename = os.path.join('images', current_display_image) # 原始答案中的写法
image_path_in_static = os.path.join('images', current_display_image)
return render_template("chart.html", user_image=image_path_in_static)
if __name__ == "__main__":
app.run(port=3000, debug=True)说明:
在 chart.html 中添加一个文件上传表单。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动态图片展示</title>
<style>
/* 简单的样式,让flash消息更明显 */
.flash-message {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
padding: 10px;
margin-bottom: 15px;
border-radius: 5px;
}
</style>
</head>
<body>
<h1>图片展示与刷新</h1>
<!-- Flash消息显示区域 -->
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="flash-message">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<!-- 图片上传表单 -->
<form method="post" enctype="multipart/form-data" action="{{ url_for('upload_file') }}">
<input type="file" name="file" accept="image/*">
<input type="submit" value="上传新图片">
</form>
<br>
@@##@@
<script>
document.addEventListener('DOMContentLoaded', function() {
const dynamicImage = document.getElementById('dynamicImage');
const originalSrc = dynamicImage.src.split('?')[0];
setInterval(function() {
const newSrc = originalSrc + '?' + new Date().getTime();
dynamicImage.src = newSrc;
console.log('Image refreshed:', newSrc);
}, 5000);
});
</script>
</body>
</html>说明:
通过以上步骤,您已经成功构建了一个Flask应用,它不仅能够展示静态图片,还能通过JavaScript实现图片的定时刷新,并支持用户上传新的图片来动态更新显示内容。
以上就是Flask应用中动态图片更新与上传教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号