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

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

本教程详细介绍了如何在flask web应用中展示静态图片,并通过%ignore_a_1%实现图片的定时刷新,解决浏览器缓存问题。同时,文章还涵盖了如何在flask后端处理图片上传,并将其与前端展示及刷新机制相结合,提供了一个完整的图片管理与动态显示解决方案。

1. Flask应用中静态图片的基本展示

在Flask应用中展示静态图片是基础操作,通常涉及配置静态文件目录和在HTML模板中正确引用图片。

1.1 Flask后端配置与路由

首先,我们需要一个Flask应用实例,并指定静态文件(如图片)的存放位置。通常,静态文件会放在项目根目录下的 static 文件夹中。

import osfrom flask import Flask, render_template, url_for, flash, request, redirectfrom 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 "

Website running!

"# 检查文件是否允许上传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) # 开启调试模式便于开发

说明:

app.config[‘UPLOAD_FOLDER’] 设置了图片上传的目录。show_img 路由负责渲染 chart.html 模板,并将 user_image 变量传递给模板,该变量是图片在 static 目录下的相对路径(例如 images/chart.png)。

1.2 HTML模板中引用图片

chart.html 模板将使用Flask的 url_for 函数来正确引用静态文件。

            动态图片展示    

图片展示与刷新


@@##@@ // JavaScript代码将在此处添加

说明:

动态图片 使用 url_for(‘static’, filename=user_image) 生成图片的完整URL。user_image 是从Flask后端传递过来的 images/chart.png。id=”dynamicImage” 为图片元素添加了一个ID,以便JavaScript可以轻松地选中并操作它。

2. 使用JavaScript实现图片定时刷新

当图片文件名不变,但其内容在服务器端发生更新时,浏览器可能会因为缓存机制而继续显示旧图片。为了强制浏览器加载新图片,我们需要在图片URL中添加一个动态参数(通常是时间戳),使每次请求的URL都不同。

2.1 解决浏览器缓存问题

浏览器会缓存静态资源以提高加载速度。如果图片的URL没有改变,即使服务器上的图片内容已更新,浏览器也可能直接从缓存中读取旧图片。通过在URL后添加一个唯一的查询参数(如 ?timestamp=1678886400000),可以欺骗浏览器认为这是一个全新的资源,从而强制它重新下载。

2.2 JavaScript实现定时刷新

在 chart.html 中添加以下JavaScript代码,实现每5秒刷新一次图片。

            动态图片展示    

图片展示与刷新


@@##@@ 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秒刷新一次 });

说明:

document.addEventListener(‘DOMContentLoaded’, …) 确保在DOM完全加载后再执行JavaScript。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 osfrom flask import Flask, render_template, url_for, flash, request, redirect, current_appfrom werkzeug.utils import secure_filenameALLOWED_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 "

Website running!

"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)

说明:

upload_file 路由处理 POST 请求,接收用户上传的文件。secure_filename(file.filename) 是 werkzeug 提供的工具,用于清理文件名,防止路径遍历等安全问题。为了与前端的刷新机制协同,我们将所有上传的图片都保存为 chart.png。这样,每次上传新图片,都会覆盖旧的 chart.png,而前端的JavaScript定时刷新机制会检测到URL变化(通过时间戳),从而加载新的 chart.png 内容。flash 用于显示一次性消息给用户,需要在模板中配合 get_flashed_messages() 使用。global current_display_image 声明 current_display_image 是全局变量,以便在函数内部修改它。

3.2 前端上传表单

在 chart.html 中添加一个文件上传表单。

            动态图片展示            /* 简单的样式,让flash消息更明显 */        .flash-message {            background-color: #d4edda;            color: #155724;            border: 1px solid #c3e6cb;            padding: 10px;            margin-bottom: 15px;            border-radius: 5px;        }        

图片展示与刷新

{% with messages = get_flashed_messages() %} {% if messages %}
    {% for message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %} {% endwith %}
@@##@@ 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); });

说明:

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应用,它不仅能够展示静态图片,还能通过JavaScript实现图片的定时刷新,并支持用户上传新的图片来动态更新显示内容。

动态图片动态图片动态图片

以上就是Flask应用中动态图片更新与上传教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1604378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 18:00:31
下一篇 2025年12月23日 18:00:46

相关推荐

  • CSS过渡动画:轻松为HTML按钮添加交互效果

    本教程将详细介绍如何利用css的transition属性,为html按钮创建平滑的悬停动画,无需复杂的javascript脚本。通过设置过渡属性和悬停样式,开发者可以轻松实现背景色、文本颜色、缩放等多种动态效果,显著提升用户界面的交互性和视觉吸引力。 理解CSS transition 属性 CSS …

    2025年12月23日
    000
  • 如何写html个人中心_编写HTML个人中心页面布局【个人】

    需用语义化HTML5标签构建结构,结合Flexbox实现响应式三栏布局,辅以表格展示固定信息、SVG图标替代字体图标,并集成可编辑表单控件。 如果您需要创建一个简洁实用的HTML个人中心页面,需围绕用户信息展示、导航功能和内容区域进行结构化布局。以下是实现该页面的多种基础方法: 一、使用语义化HTM…

    2025年12月23日
    000
  • 纯CSS实现点击按钮触发Div滑入动画教程

    本教程详细介绍了如何利用纯css,通过巧妙结合input[type=”checkbox”]元素和通用兄弟选择器,实现点击按钮时触发div元素的动态滑入动画,无需编写任何javascript代码。文章将深入解析其工作原理、提供完整的代码示例,并探讨相关注意事项与扩展应用。 在W…

    2025年12月23日 好文分享
    000
  • 在React Native WebView中保持键盘开启状态的策略

    本文探讨了在react native的webview组件中,当输入框失去焦点时如何避免虚拟键盘自动关闭的问题。核心解决方案在于优化html中的事件处理逻辑,通过使用`onchange`事件而非`oninput`,并直接调用目标输入框的`focus()`方法,确保焦点无缝转移,从而维持键盘的持续显示,…

    2025年12月23日
    000
  • HTML如何重置表单数据_JavaScript清空方法【教程】

    可通过JavaScript重置HTML表单:一、调用form.reset()恢复初始值;二、遍历元素设value为空字符串;三、单独设置特定字段value为空;四、结合FormData API捕获数据后清空。 如果您在网页中使用了HTML表单,但需要在用户提交后或特定操作时将所有输入字段恢复为初始状…

    2025年12月23日
    000
  • 如何在React select 元素中获取多个选中项值

    本文旨在解决React `select` 组件中获取多个选中项值的问题。当尝试将对象直接赋给 `option` 的 `value` 属性时,常会遇到 `[Object object]` 的情况。教程将详细介绍两种主流解决方案:一是通过存储唯一标识符并在 `onChange` 事件中检索完整数据对象,…

    2025年12月23日
    000
  • JavaScript/jQuery 中处理含本地化货币字符串的精确计算与格式化

    本文旨在提供一套完整的解决方案,用于在 JavaScript/jQuery 环境中处理包含货币符号、千位分隔符和本地化小数分隔符的价格字符串,并进行精确的税务计算,最终将结果格式化为用户友好的本地化货币字符串。 处理含本地化价格字符串的计算挑战 在 Web 开发中,尤其是在涉及电子商务或财务计算的场…

    2025年12月23日
    000
  • Jenkins自动化:解析HTML响应并根据数值条件触发邮件通知

    本文详细介绍了如何在jenkins中实现一个自动化流程,通过发起http get请求获取html响应。我们将学习如何利用jenkins dsl和groovy脚本解析html内容,提取特定数值,并根据该数值是否超过预设阈值(例如100)来触发邮件通知。这为监控系统状态、服务队列或其他基于html响应的…

    2025年12月23日
    000
  • html如何做烟花_HTML结合Canvas实现烟花动画效果【效果】

    可利用Canvas与JavaScript实现动态烟花效果:创建画布、定义粒子类、控制发射爆炸逻辑、动画循环更新、逐帧绘制、支持点击触发,并优化性能与视觉细节。 如果您希望在网页中呈现动态的烟花爆炸效果,可以利用HTML的Canvas元素结合JavaScript绘制粒子运动轨迹。以下是实现该效果的具体…

    2025年12月23日
    000
  • 表单验证中的本地DOM操作与错误提示处理

    本文深入探讨了使用html、css和javascript实现本地表单验证时常见的dom操作问题,特别是针对`queryselectorall`返回的`nodelist`进行元素操作时遇到的`typeerror`。文章提供了详细的解决方案,包括如何正确遍历和操作dom集合,以及构建一个健壮的表单验证逻…

    2025年12月23日 好文分享
    000
  • 深入理解Angular HTTP异步:POST后立即刷新数据的正确姿势

    在angular应用中,当执行http post请求后立即尝试通过http get请求刷新数据时,可能会遇到数据未更新的问题。这通常是由于http请求的异步特性所致。本文将深入探讨这一现象的原因,并提供将get请求置于post请求的`subscribe`回调中的正确解决方案,以确保数据在post操作…

    2025年12月23日
    000
  • HTML开发如何收费_项目报价标准解析【指南】

    HTML网站开发报价差异源于服务范围、技术实现与交付标准不同:静态页800–3000元/页,响应式整站5000–12000元,JS交互功能每项加收800–2000元;语义化结构、CSS架构、性能优化等交付物单独计费;交付模式分纯代码、设计转码、全托管三类,报价系数为0.7–1.5;字体授权、IE11…

    2025年12月23日
    000
  • 如何实现HTML分屏显示_CSS多窗口布局方案【教程】

    实现HTML分屏显示有五种CSS方案:一、CSS Grid双栏布局;二、Flexbox左右分屏;三、绝对定位手动划分;四、Viewport单位全屏三分屏;五、Container Queries响应式分屏。 如果您希望在网页中同时展示多个独立内容区域,实现类似分屏或多窗口的视觉效果,则需要借助CSS的…

    2025年12月23日
    000
  • 使用JavaScript动态加载HTML列表:优化前端大型数据展示

    本文旨在提供一种优化大型HTML列表显示与管理的前端策略。针对包含大量条目导致HTML代码冗长的问题,我们探讨了将列表内容模块化为独立HTML文件,并利用JavaScript(如jQuery的`load()`方法)进行动态按需加载的方法。此方案能有效减少初始页面加载的HTML代码量,提升代码可维护性…

    2025年12月23日 好文分享
    000
  • HTML表单提交在新标签页打开:解决方案与最佳实践

    当html表单点击提交按钮后意外地在新标签页中打开当前页面时,这通常是由于表单元素设置了`target=”_blank”`属性所致。解决此问题的核心方法是移除表单标签中的`target=”_blank”`属性。此外,如果表单提交由javascript处…

    2025年12月23日
    000
  • 如何在html上引用html_在HTML页面上引用外部HTML文件【引用】

    可通过iframe、JavaScript动态加载、object标签、服务端包含(SSI)四种方式嵌入外部HTML;HTML Imports已废弃不可用。 如果您希望在当前HTML页面中嵌入另一个HTML文件的内容,而不是重复编写相同代码,则需要通过特定方式加载外部HTML片段。以下是实现此目标的多种…

    2025年12月23日
    000
  • Flexbox布局中居中元素间距的最佳实践:gap属性详解

    本教程探讨在`display: flex`容器中,当需要元素居中且具有特定内部间距时,如何优雅地解决布局挑战。针对`justify-content: space-between`和`space-around`无法满足的需求,我们将详细介绍css `gap`属性,展示其在保持元素居中同时,高效、简洁地…

    2025年12月23日
    000
  • Laravel Blade模板中DIV元素样式定制指南:字体、间距与最佳实践

    本教程详细介绍了如何在laravel blade模板中为div元素应用自定义字体、调整大小和设置间距。我们将探讨常见的错误、正确的内联样式方法,并强调使用css类的最佳实践,同时指导如何正确集成自定义字体,以实现清晰、可维护的样式控制。 引言:理解Blade模板中的样式需求 在构建Web应用时,我们…

    2025年12月23日
    000
  • html5标签如何记_HTML5标签记忆方法与快速掌握技巧【详解】

    HTML5常用标签可通过五种方法高效记忆:一、语义化分组归类法;二、词根联想记忆法;三、结构树形图谱法;四、高频场景替换法;五、代码片段速查卡片法。 如果您在学习HTML5时发现标签数量众多、结构相似、容易混淆,则可能是由于缺乏系统性的记忆策略。以下是帮助您快速掌握HTML5常用标签的多种记忆方法:…

    2025年12月23日
    000
  • html文件怎么运行_运行html文件方法【教程】

    可通过浏览器直接打开HTML文件,右键选择浏览器打开即可查看;2. 在浏览器地址栏输入文件路径也可加载本地HTML;3. 使用VS Code等编辑器配合Live Server插件实现热更新预览;4. 对需HTTP环境的项目,可用Python命令启动本地服务器,通过localhost访问页面。 如果您…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信