新闻中心
Flask应用中动态图片更新与上传教程

本教程详细介绍了如何在flask web应用中展示静态图片,并通过j*ascript实现图片的定时刷新,解决浏览器缓存问题。同时,文章还涵盖了如何在flask后端处理图片上传,并将其与前端展示及刷新机制相结合,提供了一个完整的图片管理与动态显示解决方案。
1. Flask应用中静态图片的基本展示
在Flask应用中展示静态图片是基础操作,通常涉及配置静态文件目录和在HTML模板中正确引用图片。
1.1 Flask后端配置与路由
首先,我们需要一个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_imag
e=image_path_in_static)
# ... (上传路由将在后续章节添加)
if __name__ == "__main__":
app.run(port=3000, debug=True) # 开启调试模式便于开发说明:
- app.config['UPLOAD_FOLDER'] 设置了图片上传的目录。
- show_img 路由负责渲染 chart.html 模板,并将 user_image 变量传递给模板,该变量是图片在 static 目录下的相对路径(例如 images/chart.png)。
1.2 HTML模板中引用图片
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>
// J*aScript代码将在此处添加
</script>
</body>
</html>说明:
-
使用 url_for('static', filename=user_image) 生成图片的完整URL。user_image 是从Flask后端传递过来的 images/chart.png。
- id="dynamicImage" 为图片元素添加了一个ID,以便J*aScript可以轻松地选中并操作它。
2. 使用J*aScript实现图片定时刷新
当图片文件名不变,但其内容在服务器端发生更新时,浏览器可能会因为缓存机制而继续显示旧图片。为了强制浏览器加载新图片,我们需要在图片URL中添加一个动态参数(通常是时间戳),使每次请求的URL都不同。
2.1 解决浏览器缓存问题
浏览器会缓存静态资源以提高加载速度。如果图片的URL没有改变,即使服务器上的图片内容已更新,浏览器也可能直接从缓存中读取旧图片。通过在URL后添加一个唯一的查询参数(如 ?timestamp=1678886400000),可以欺骗浏览器认为这是一个全新的资源,从而强制它重新下载。
2.2 J*aScript实现定时刷新
在 chart.html 中添加以下J*aScript代码,实现每5秒刷新一次图片。
iWebShop开源商城系统
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>说明:
- document.addEventListener('DOMContentLoaded', ...) 确保在DOM完全加载后再执行J*aScript。
- dynamicImage.src.split('?')[0] 获取图片的原始URL,去除任何现有的查询参数。
- setInterval(function() { ... }, 5000) 设置一个定时器,每5000毫秒(5秒)执行一次内部函数。
- new Date().getTime() 生成一个当前时间戳,作为唯一的查询参数添加到图片URL后。这样,每次定时器触发时,图片的 src 属性都会是一个新的URL,从而强制浏览器重新请求图片。
3. 集成图片上传功能
为了让用户能够上传新的图片,我们需要在Flask后端添加一个文件上传路由,并在前端提供一个上传表单。
3.1 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'
# 这样前端的刷新机制就能直接获取到更新后的图片
s*e_filename = 'chart.png'
file_path = os.path.join(app.config['UPLOAD_FOLDER'], s*e_filename)
# 如果文件已存在,先删除旧文件
if os.path.exists(file_path):
os.remove(file_path)
file.s*e(file_path)
current_display_image = s*e_filename # 更新当前显示的文件名
flash(f'File "{filename}" uploaded successfully as "{s*e_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)说明:
- upload_file 路由处理 POST 请求,接收用户上传的文件。
- secure_filename(file.filename) 是 werkzeug 提供的工具,用于清理文件名,防止路径遍历等安全问题。
- 为了与前端的刷新机制协同,我们将所有上传的图片都保存为 chart.png。这样,每次上传新图片,都会覆盖旧的 chart.png,而前端的J*aScript定时刷新机制会检测到URL变化(通过时间戳),从而加载新的 chart.png 内容。
- flash 用于显示一次性消息给用户,需要在模板中配合 get_flashed_messages() 使用。
- global current_display_image 声明 current_display_image 是全局变量,以便在函数内部修改它。
3.2 前端上传表单
在 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>说明:
- name="file" 对应于Flask后端 request.files['file'] 中的键。
- accept="image/*" 提示用户选择图片文件。
- {% with messages = get_flashed_messages() %} 是Flask模板中显示 flash 消息的标准方式。
4. 注意事项与最佳实践
- current_app 的使用: 在请求上下文中,使用 current_app.config 而不是直接使用 app.config 是更推荐的做法,尤其是在使用蓝图(Blueprints)或多线程/多进程环境中,它能确保访问到正确的应用配置。在本教程的简单示例中,直接使用 app.config 也能工作,但了解 current_app 的存在很重要。
-
文件上传安全性:
- 始终使用 secure_filename 处理上传的文件名。
- 严格限制 ALLOWED_EXTENSIONS,只允许已知安全的图片格式。
- 对上传文件进行大小限制,防止拒绝服务攻击。
- 考虑将上传的文件存储在应用根目录之外,以提高安全性。
-
全局变量的局限性: 本教程为了简化演示,使用了全局变量 current_display_image 来存储当前显示的图片文件名。在生产环境中,这会导致问题,因为所有用户都会共享同一个全局变量。更健壮的解决方案包括:
- 将文件名存储在数据库中。
- 将文件名存储在用户会话(session)中(如果每个用户有自己的图片)。
- 使用Redis或其他缓存系统。
- 更高级的文件上传库: 对于复杂的上传需求(如文件验证、进度条、多文件上传等),推荐使用成熟的第三方库,例如 Flask-Reuploaded (它是 Flask-Uploads 的维护分支),它提供了更强大的功能和更好的抽象。
- 图片处理: 如果上传的图片需要缩放、裁剪或添加水印等处理,可以在文件保存后使用 Pillow (PIL Fork) 等库进行处理。
通过以上步骤,您已经成功构建了一个Flask应用,它不仅能够展示静态图片,还能通过J*aScript实现图片的定时刷新,并支持用户上传新的图片来动态更新显示内容。
以上就是Flask应用中动态图片更新与上传教程的详细内容,更多请关注其它相关文章!
# 图片上传
# 推广和营销都选 传播易
# 新源seo优化全托管
# 淮安常规网站建设协议
# 小型网站建设理念怎么写
# 忻州短视频seo品牌
# 抖音医疗关键词排名优化
# seo实战密码4
# seo关键词选择实例
# 各行各业网站建设
# 网站推广微心hfqjwl做词
# 是在
# 加载
# 将在
# 开源
# 文件上传
# javascript
# 全局变量
# 表单
# 上传
# re
# 路由
# ai
# 后端
# session
# 工具
# app
# 浏览器
# 前端
# html
# redis
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
《GTA6》开发画面疑似泄露!这次可不是AI了
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
QQ官网正版登录链接 QQ在线登录入口最新
狙击外星人小游戏开始_狙击外星人小游戏立即开始
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
Typer应用中动态命令行参数的解析与处理
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
理解Python模块与全局变量的作用域管理
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
163邮箱注册官网 免费申请163个人邮箱
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
J*a递归快速排序中静态变量导致数据累积问题的解决方案
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
百度网盘网页版入口 百度网盘网页版官方登录网址
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
响应式容器内容自动缩放与宽高比维持教程
J*aScript DOM操作:高效清空列表元素的策略与实践
如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
PySpark中从现有列右侧提取可变长度字符创建新列的教程
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
漫蛙2漫画入口 漫蛙正版网页漫画直达网址
Archive of Our Own官网直达 AO3最新可用地址一览
生成rdflib自定义SPARQL函数:参数匹配与实践指南
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
mc.js免安装版 mc.js一键畅玩入口
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
Discord Slash 命令响应超时问题的异步解决方案


2025-12-13
浏览次数:次
返回列表
e=image_path_in_static)
# ... (上传路由将在后续章节添加)
if __name__ == "__main__":
app.run(port=3000, debug=True) # 开启调试模式便于开发