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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS过渡动画:轻松为HTML按钮添加交互效果
上一篇 2025年12月23日 18:00:31
在浏览器ES模块中使用自定义加载器:从Node.js经验到前端实践
下一篇 2025年12月23日 18:00:46

相关推荐

  • 荣耀Magic8系列配置曝光 有小尺寸机型续航影像再提升

    荣耀magic8系列的配置信息近日被曝光,据数码博主透露,该系列将包含三款不同尺寸的机型,满足多样化的用户需求。其中一款为小尺寸机型,主打便携性,而另外两款则分别为中尺寸和大尺寸机型。值得一提的是,其中两个版本或将配备3d人脸识别功能,这一技术与华为、苹果所采用的高安全级别生物识别方案类似。从推测来…

    2026年8月29日
    100
  • Word如何将文档属性中的作者信息清除_Word文档检查器删除个人信息

    1、使用文档检查器可批量清除作者信息:打开Word文档后进入文件→信息→检查文档,勾选文档属性和个人信息并删除。2、手动修改文档属性:在文件→信息→显示所有属性中直接删除或更改作者字段。3、另存为新文档以剥离元数据:全选原内容复制到新建空白文档并保存,新文档将不包含原始元数据。 如果您在共享或发送W…

    2026年8月29日
    200
  • VSCode怎么编写地图定位_VSCode集成地图API开发位置服务应用教程

    答案是集成地图API实现定位需选择服务商、引入SDK、初始化地图并调用定位功能。具体为:在VSCode中创建Web项目,引入百度等地图API的SDK,通过HTML页面加载地图容器,使用JavaScript初始化地图实例,并结合浏览器Geolocation API或地图SDK自带控件获取位置,最后添加…

    2026年8月29日
    000
  • 测试app开发成果?关键步骤!

    在app开发过程中,将创意转化为可运行的代码只是成功的一半。测试app才是确保最终产品符合预期、用户满意且市场表现良好的关键环节。忽略或轻视测试,往往导致糟糕的用户体验、负面评价,甚至业务损失。那么,如何系统有效地测试app开发成果?以下关键步骤必不可少: 制定详尽的测试计划与策略 明确目标: 测试…

    2026年8月29日
    400
  • 0x0000007a电脑蓝屏怎么解决

    错误代码:0x0000007A 提示信息:KERNEL-DATA-INPAGE-ERROR 常见原因:未能成功将内核所需的数据页面加载至内存中(可能因分页文件损坏、病毒感染、磁盘控制器异常或内存故障引起)。 解决方案: (1) 使用最新版的反病毒软件对计算机进行全面扫描,若发现病毒,请按指示清除病毒…

    2026年8月29日
    100
  • 如何解决WSDL文件处理和验证问题?使用php-soap/wsdl库可以!

    可以通过以下地址学习composer:学习地址 在开发过程中,我常常需要处理和验证wsdl文件,这是一个复杂且容易出错的任务。最近,我在处理一个包含多层嵌套和导入的wsdl文件时遇到了问题。每次尝试加载和解析这些文件时,都会遇到各种错误和性能问题。为了解决这些问题,我开始寻找一个能简化wsdl文件处…

    用户投稿 2026年8月29日
    000
  • 微软开源系统工具PowerToys:一个曾被盖茨下令砍掉的软件

    微软开源系统工具PowerToys:一个曾被盖茨下令砍掉的软件微软开源系统工具PowerToys:一个曾被盖茨下令砍掉的软件微软开源系统工具PowerToys:一个曾被盖茨下令砍掉的软件微软开源系统工具PowerToys:一个曾被盖茨下令砍掉的软件

    晓查 发自 凹非寺 量子位 报道 | 公众号 qbitai 微软最近对Windows系统软件的开源热情高涨,两个月前是计算器,两天前是终端,每次都引发了GitHub上的热潮。 今天,微软再次开源了一款系统软件——PowerToys。没听说过?这很正常,如果你知道它反而显得你年纪大了。 PowerTo…

    2026年8月29日 用户投稿
    100
  • 网易也做了个小红书!

    村长第1114原创 不扯高大上 只讲真实干 感谢关注、评论和转发 各位村民好,我是村长 网易盯上了小红书,也要搞种草社交了。 这是今天刷新闻的时候,看到的一条内容,于是出于职业习惯的去打开看了一下。 果然,网易上线了一个内容分享内的产品叫:网易小蜜蜂。 01 网易小蜜蜂,要做翻版小红书? 网易作为国…

    2026年8月29日
    100
  • 360浏览器如何清除上网痕迹 360浏览器一键清除个人浏览数据方法

    首先使用快捷键Ctrl+Shift+Del可快速清除浏览历史、缓存和Cookie等数据,其次通过右上角菜单进入工具选项也能清理上网痕迹,最后可通过设置中心的隐私与安全功能进行深度管理和自动化清理。 如果您在使用360浏览器时希望保护个人隐私,防止他人查看您的浏览活动,可以通过清除上网痕迹来删除历史记…

    2026年8月29日
    100
  • 智能助手能帮我写代码吗_使用AI编程助手编写和调试代码

    AI编程助手不能取代程序员,它可辅助生成代码、检查错误、补全代码和生成文档,但需人工审核;选择时应考虑语言支持、代码质量、易用性和价格;使用中应避免过度依赖,注意代码安全与隐私。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 当然,智能助手…

    2026年8月29日
    100
  • 新华网财经观察丨当家电拥抱大模型

    新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型

    ai赋能家电:智能家居新时代来临 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在人工智能浪潮席卷全球的当下,国内头部家电品牌正积极拥抱“AI+家电”模式,纷纷加大自主研发投入,布局AI大模型技术,同时积极引入DeepSeek等开源大模型,…

    2026年8月29日 用户投稿
    100
  • workerman是怎么区分用户的

    WorkerMan区分用户的方式取决于连接ID,将连接ID与用户数据关联。具体方法包括:字典映射(低并发场景)、Redis哈希结构(高并发场景)、数据库(复杂数据管理)。优化要点:选择合适的数据存储、使用连接池、采用异步操作、处理错误、保证代码可读。 WorkerMan用户区分:深度剖析与最佳实践 …

    2026年8月29日
    100
  • Java中如何将集合元素连接成一个字符串

    使用String.join()可直接连接字符串集合,Java 8可用Stream API的collect(Collectors.joining())处理任意类型,StringBuilder适合高性能场景。 在Java中,将集合元素连接成一个字符串有多种方式,最常用的是使用 String.join()…

    2026年8月29日
    100
  • 贝壳找房怎么收藏喜欢的房源_贝壳找房App收藏房源操作指南

    在贝壳找房App中,进入房源详情页点击右上角爱心图标即可收藏;2. 收藏后可在“我的”-“我的收藏”中查看和管理;3. 点击已收藏的红色爱心可取消;4. 建议收藏时添加“近地铁”“学区房”等备注便于后续筛选。 在贝壳找房App上收藏喜欢的房源很简单,方便你随时查看和对比。 如何收藏房源 打开贝壳找房…

    2026年8月29日
    000
  • 灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验

    灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验

    在这个视觉内容主导的时代,无论是朋友圈还是各类社交平台,自拍已成为极具吸引力的内容形式之一。人们通过发布状态满分的自拍作品展示个性风格、记录生活点滴,并从中获得更多的认同与互动。正因如此,在不断记录自我的过程中,用户对手机拍摄性能的要求也日益提升。三星galaxyz flip7凭借“立式自由拍摄系统…

    2026年8月29日 用户投稿
    100
  • thinkphp怎么实现分页教程

    ThinkPHP分页的核心在于SQL LIMIT子句,paginate()方法封装了底层数据库查询和数据处理。它允许自定义分页样式和参数,并提供性能优化技巧,如使用缓存、数据库优化和避免N+1问题,以应对复杂的分页场景。 ThinkPHP分页:不止是paginate()那么简单 很多朋友觉得Thin…

    2026年8月29日
    300
  • 关于Windows 10系统重置了但以前的office找不到了问题的解决方法

    关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法

    关于windows 10系统重置后无法找到之前的office软件的解决方案,首先需要在微软官网登录自己的windows账户,确认账户中是否有记录的设备信息。如果没有,请使用微软账号登录windows系统。接着,访问office官网,检查账户下是否有office设备记录。如果没有找到,请在电脑上搜索w…

    2026年8月29日 用户投稿
    400
  • Win7系统摄像头打不开是怎么回事?Win7系统摄像头打不开解决办法

    在日常使用电脑的过程中,摄像头是一个非常实用的工具。然而,有时我们可能会遇到摄像头无法正常开启的情况。那么,为什么会发生这样的问题呢?下面我们一起来分析一下可能的原因。 首先,最常见的一个原因是驱动程序相关的问题。如果摄像头的驱动没有正确安装或者已经过时,就可能导致设备无法正常运行。其次,某些正在运…

    2026年8月29日
    200
  • Android WebView无法加载alipays://协议链接怎么办?

    Android WebView加载alipays://协议链接失败的解决方案 在Android开发中,WebView有时无法加载自定义URL scheme,例如alipays://,导致出现net::err_unknown_url_scheme错误,即使重写了shouldOverrideUrlLoa…

    2026年8月29日
    200
  • 曝苹果iPhone 17 Air将主打蓝色 秋季发布 颜值稳了?

    据海外媒体报道,苹果即将推出的iphone 17 air在配色方面或将带来全新选择。这款机型或将主打一种前所未有的浅蓝色,成为苹果历史上最具辨识度的蓝色版本。 根据爆料信息,这种蓝色调非常淡雅,呈现出接近白灰色的视觉效果,在较暗环境下甚至可能被误认为是白色。如果消息属实,这将是继iPhone 13 …

    2026年8月29日
    200

发表回复

登录后才能评论
关注微信