讲师中心 微信公众号
AI工具推荐 视频效率加速

在Flask应用中利用JavaScript实现动态图片更新教程

风强姑娘_7301

风强姑娘_7301

发布时间:2025-12-01 11:03:06

|

576人浏览过

|

来源于php中文网

原创

在Flask应用中利用JavaScript实现动态图片更新教程

本教程详细介绍了如何在python flask web应用中实现图片的周期性自动更新。我们将学习如何使用javascript在客户端定时刷新图片,并探讨flask后端如何配合处理图片文件,确保前端能够获取到最新的图像内容,即使文件名保持不变。

引言:动态图片更新的需求

在现代Web应用开发中,许多场景需要动态展示或更新图片内容,而无需刷新整个页面。例如,实时监控仪表盘上的图表、用户头像更新、验证码刷新等。这种需求通常通过后端服务提供最新的图片资源,并结合前端技术(尤其是JavaScript)在客户端实现周期性刷新来满足。本教程将以Python Flask框架为例,详细讲解如何实现这一功能,包括Flask后端配置、HTML模板渲染以及JavaScript客户端刷新策略。

Flask后端基础配置与图片展示

首先,我们需要一个Flask应用来提供图片服务。图片通常作为静态文件存储在Flask项目的 static 目录下。

1. Flask应用配置

在 app.py 中,我们配置静态文件路径,并创建一个路由来渲染包含图片的HTML页面。

import os
from flask import Flask, render_template, current_app

app = Flask(__name__)

# 配置静态文件目录,图片将存放在 static/images
# 注意:在生产环境中,通常会使用更安全的方式处理上传文件路径
app.config['UPLOAD_FOLDER'] = os.path.join('static', 'images')

@app.route("/")
def running():
    return "<p>Website running!</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a>”;</p>"

@app.route("/chart")
def show_img():
    # 假设我们有一张名为 chart.png 的图片在 static/images 目录下
    # 这里的 'images/chart.png' 是相对于 static 目录的路径
    image_path_in_static = os.path.join('images', 'chart.png')
    # 将图片路径传递给模板
    return render_template("chart.html", user_image=image_path_in_static)

if __name__ == "__main__":
    # 确保 static/images 目录存在
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    # 在 static/images 目录下放置一个名为 chart.png 的图片文件作为初始图片
    # 例如,可以放一个空白图片或示例图片
    # with open(os.path.join(app.config['UPLOAD_FOLDER'], 'chart.png'), 'w') as f:
    #     f.write("dummy content for chart.png") # 实际应放置有效的图片文件
    app.run(port=3000, debug=True)

注意事项:

  • app.config['UPLOAD_FOLDER'] 用于指定图片存储的路径。
  • 在路由函数中,推荐使用 current_app 而不是直接访问 app 对象,这在大型应用或使用蓝图时更为灵活。
  • os.path.join('images', 'chart.png') 构建的是相对于 static 目录的路径,这样在模板中使用 url_for('static', filename=...) 时更简洁。

2. HTML模板 (chart.html)

在 templates/chart.html 中,我们使用 在Flask应用中利用JavaScript实现动态图片更新教程 标签来显示图片,并利用Flask的 url_for 函数生成正确的静态文件URL。

<!DOCTYPE html>
<html>
<head>
    <title>动态图片展示</title>
</head>
<body>
    <h1>动态图片示例</h1>
    <!-- 使用 user_image 变量来动态生成图片URL -->
    <img id="dynamicImage" src="{{ url_for('static', filename=user_image) }}" alt="动态图表"   style="max-width:90%">

    <!-- JavaScript 将在此处添加 -->
</body>
</html>

此时,访问 http://localhost:3000/chart 应该能看到 static/images/chart.png 这张图片。

JavaScript实现客户端图片周期性刷新

为了实现图片的周期性更新,我们需要在前端使用JavaScript。核心思想是定时修改 在Flask应用中利用JavaScript实现动态图片更新教程 元素的 src 属性。

1. 解决浏览器缓存问题

浏览器通常会缓存静态资源,这意味着即使图片的 src 属性被重新赋值,浏览器也可能直接从缓存中加载旧图片,而不是向服务器请求新图片。为了强制浏览器重新加载图片,我们可以在图片URL后添加一个唯一的查询参数(如时间戳或随机数),这被称为“缓存破坏器”(Cache Buster)。

2. 添加JavaScript代码到 chart.html

<!DOCTYPE html>
<html>
<head>
    <title>动态图片展示</title>
</head>
<body>
    <h1>动态图片示例</h1>
    <img id="dynamicImage" src="{{ url_for('static', filename=user_image) }}" alt="动态图表"   style="max-width:90%">

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const imgElement = document.getElementById('dynamicImage');
            const originalSrc = imgElement.src.split('?')[0]; // 获取不带查询参数的原始URL

            // 每5秒更新一次图片
            setInterval(function() {
                // 添加时间戳作为查询参数,强制浏览器重新加载图片
                imgElement.src = originalSrc + '?' + new Date().getTime();
                console.log('Image refreshed at:', new Date().toLocaleTimeString());
            }, 5000); // 5000毫秒 = 5秒
        });
    </script>
</body>
</html>

代码解释:

  • document.addEventListener('DOMContentLoaded', ...) 确保在DOM完全加载后执行JavaScript。
  • imgElement 获取到 id="dynamicImage" 的 在Flask应用中利用JavaScript实现动态图片更新教程 元素。
  • originalSrc 存储了图片的基础URL,以便在每次刷新时重新构建带有新时间戳的URL。
  • setInterval(function() { ... }, 5000) 设置一个定时器,每5000毫秒(5秒)执行一次内部的匿名函数。
  • imgElement.src = originalSrc + '?' + new Date().getTime(); 是关键。它将 在Flask应用中利用JavaScript实现动态图片更新教程 元素的 src 属性更新为原始URL加上一个当前时间戳作为查询参数。由于查询参数每次都不同,浏览器会认为这是一个新的URL,从而发起新的请求去服务器获取最新的图片。

后端图片更新机制(概念性讨论)

前端JavaScript能够定时刷新,但前提是后端服务器上的图片文件本身已经发生了变化。后端更新图片的方式有多种,这里介绍两种常见场景:

1. 外部进程更新图片

在许多情况下,图片(如图表、报告)是由一个独立的后端服务或脚本周期性生成并覆盖 static/images/chart.png 文件的。例如,一个数据分析脚本每隔一段时间生成新的图表,并将其保存为 chart.png。当文件被覆盖后,前端的JavaScript刷新机制就能获取到这张新图片。

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载

2. 用户上传更新图片

如果图片是由用户上传的,Flask后端需要提供一个文件上传接口来接收新图片,并将其保存到 static/images 目录下,通常会覆盖旧文件(如果文件名相同)。

以下是一个简化的Flask文件上传示例,用于说明后端如何处理图片更新:

更新 app.py:

import os
from flask import Flask, flash, request, redirect, url_for, render_template, current_app
from werkzeug.utils import secure_filename # 用于安全地处理文件名

app = Flask(__name__)
app.secret_key = 'super_secret_key' # 用于flash消息,生产环境请使用复杂密钥

# 配置静态文件目录,图片将存放在 static/images
app.config['UPLOAD_FOLDER'] = os.path.join('static', 'images')
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} # 允许上传的图片类型

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route("/")
def running():
    return "<p>Website running!</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a>”;</p>"

@app.route("/chart")
def show_img():
    # 假设我们有一张名为 chart.png 的图片在 static/images 目录下
    image_filename = 'chart.png' # 固定图片文件名
    image_path_in_static = os.path.join('images', image_filename)
    return render_template("chart.html", user_image=image_path_in_static)

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    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 确保文件名安全
            # 这里我们强制保存为 'chart.png',覆盖旧文件
            filename = 'chart.png' # secure_filename(file.filename)
            file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename))
            flash('Image successfully uploaded and updated!')
            return redirect(url_for('show_img')) # 重定向到图片展示页面
    return render_template('upload_form.html') # 假设你有一个简单的上传表单页面

if __name__ == "__main__":
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    app.run(port=3000, debug=True)

创建 templates/upload_form.html (可选,用于测试上传):

<!DOCTYPE html>
<html>
<head>
    <title>上传图片</title>
</head>
<body>
    <h1>上传新图片</h1>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul class=flashes>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="file" accept="image/*">
        <input type="submit" value="上传">
    </form>
    <p><a href="{{ url_for('show_img') }}">查看动态图片</a></p>
</body>
</html>

更新 chart.html,添加上传表单(可选):

你也可以直接在 chart.html 中添加上传表单,方便在同一页面操作。

<!DOCTYPE html>
<html>
<head>
    <title>动态图片展示</title>
</head>
<body>
    <h1>动态图片示例</h1>

    <!-- 上传表单 -->
    <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>

    <img id="dynamicImage" src="{{ url_for('static', filename=user_image) }}" alt="动态图表"   style="max-width:90%">

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const imgElement = document.getElementById('dynamicImage');
            const originalSrc = imgElement.src.split('?')[0];

            setInterval(function() {
                imgElement.src = originalSrc + '?' + new Date().getTime();
                console.log('Image refreshed at:', new Date().toLocaleTimeString());
            }, 5000);
        });
    </script>
</body>
</html>

专业提示: 对于更复杂的图片上传和管理,推荐使用专门的Flask扩展,如 Flask-Reuploaded (它是 Flask-Uploads 的维护分支),它提供了更强大的文件上传、验证和存储功能。

注意事项与优化

  1. 性能考量: 频繁的客户端轮询(setInterval)会增加服务器的请求负担和客户端的网络流量。对于高实时性要求或大量用户的应用,可以考虑以下优化:
    • 调整刷新频率: 根据实际需求设置合适的刷新间隔。
    • WebSockets: 对于真正的实时更新,WebSocket是更好的选择。服务器可以在图片更新时主动推送通知给客户端,客户端再根据通知刷新图片,而不是被动轮询。
  2. 错误处理: 如果图片文件在服务器端不存在或加载失败,前端 在Flask应用中利用JavaScript实现动态图片更新教程 标签会显示一个破损的图标。可以添加 onerror 事件处理来优雅地处理这种情况,例如显示一个占位符图片。
    <img id="dynamicImage" src="{{ url_for('static', filename=user_image) }}" alt="动态图表"   style="max-width:90%"
         onerror="this.onerror=null; this.src='/static/images/placeholder.png';">
  3. 安全性: 在处理用户上传文件时,务必进行严格的安全性检查:
    • 文件类型校验: 不仅检查文件扩展名,还要检查文件实际的MIME类型,防止伪造文件。
    • 文件大小限制: 限制上传文件的大小,防止DDoS攻击或存储空间耗尽。
    • 文件名安全: 使用 werkzeug.utils.secure_filename 处理文件名,防止路径遍历攻击。
    • 存储位置: 将用户上传的文件存储在Web服务器无法直接执行的目录中,防止执行恶意脚本。
  4. 用户体验: 在图片加载期间,可以显示一个加载动画或占位符,提升用户体验。

总结

通过本教程,我们学习了如何在Python Flask应用中结合JavaScript实现图片的周期性自动更新。关键在于:

  1. Flask后端: 配置静态文件服务,并提供一个路由来渲染包含图片URL的HTML模板。
  2. HTML模板: 使用 在Flask应用中利用JavaScript实现动态图片更新教程 标签展示图片,并通过 url_for 辅助函数生成正确的静态文件路径。
  3. JavaScript前端: 利用 setInterval 函数定时修改 在Flask应用中利用JavaScript实现动态图片更新教程 元素的 src 属性,并通过添加时间戳等缓存破坏器强制浏览器重新加载最新图片。
  4. 后端图片更新: 确保服务器上的图片文件能够实际被更新(无论是通过外部进程还是用户上传),这是前端刷新有效的前提。

掌握这些技术,可以为Web应用带来更丰富的动态内容展示能力,提升用户交互体验。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

3955

2024.06.27

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

6084

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

316

2025.12.15

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5129

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

486

2026.01.19

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3340

2023.08.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn