新闻中心

Flask应用中实现动态图片展示与定时刷新

2025-12-02
浏览次数:
返回列表

Flask应用中实现动态图片展示与定时刷新

本教程详细介绍了如何在python flask应用中实现图片的动态展示与定时刷新。内容涵盖flask后端正确配置图片路径、html模板中利用`url_for`显示图片,以及通过j*ascript实现前端图片的周期性更新。此外,还提供了处理图片上传以动态替换图片内容的完整示例,并强调了相关最佳实践。

在Web应用中,动态展示和定时刷新图片是一个常见的需求,例如显示实时图表、监控画面或轮播图。本教程将指导您如何在Python Flask框架下,结合HTML和J*aScript实现这一功能。

1. Flask 应用中基础图片展示

首先,我们需要在Flask应用中配置一个静态文件夹来存放图片,并通过路由将其渲染到HTML模板中。

1.1 Flask 应用配置 (app.py)

创建一个app.py文件,并设置静态文件路径。为了更好地组织项目,我们通常会将图片存放在static/images目录下。

import os
from flask import Flask, render_template, url_for, flash, request, redirect
from werkzeug.utils import secure_filename

# 配置上传文件夹和允许的文件扩展名
UPLOAD_FOLDER = os.path.join('static', 'images')
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# Flash消息需要一个密钥
app.secret_key = 'your_secret_key_here' # 生产环境请使用复杂且安全的密钥

# 辅助函数:检查文件扩展名是否允许
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route("/")
def index():
    return "<p>Flask应用正在运行!</p>"

@app.route("/chart")
def show_img():
    # 假设我们总是显示名为 'chart.png' 的图片
    image_path_in_static = os.path.join('images', 'chart.png')
    # 检查图片是否存在,如果不存在可以显示一个占位符或错误图片
    full_image_path = os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], 'chart.png')
    if not os.path.exists(full_image_path):
        image_path_in_static = 'images/placeholder.png' # 假设有一个占位符图片
        flash('图片 chart.png 不存在,请先上传!', 'error')

    return render_template("chart.html", user_image=image_path_in_static)

if __name__ == "__main__":
    # 确保上传目录存在
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    app.run(port=3000, debug=True)

代码说明:

  • app.config['UPLOAD_FOLDER']:定义了图片上传的目录,这里指向static/images。
  • @app.route("/chart"):定义了一个路由,当访问/chart时,会渲染chart.html模板。
  • render_template("chart.html", user_image=image_path_in_static):将图片在static目录下的相对路径image_path_in_static传递给模板。
  • os.makedirs(UPLOAD_FOLDER, exist_ok=True):确保在应用启动时,图片存储目录是存在的。

1.2 HTML 模板 (templates/chart.html)

在templates目录下创建chart.html文件,用于显示图片。

<!DOCTYPE html>
<html>
<head>
    <title>动态图片展示</title>
    <style>
        img { max-width: 100%; height: auto; display: block; margin-top: 20px; border: 1px solid #ddd; }
        .flash { color: green; font-weight: bold; }
        .error { color: red; font-weight: bold; }
        .flash-messages { list-style: none; padding: 0; }
    </style>
</head>
<body>
    <h1>图片展示</h1>

    {% with messages = get_flashed_messages(with_categories=true) %}
      {% if messages %}
        <ul class="flash-messages">
        {% for category, message in messages %}
          <li class="{{ category }}">{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}

    @@##@@
</body>
</html>

模板说明:

悟空CRM v 0.5.5 悟空CRM v 0.5.5

悟空CRM是一种客户关系管理系统软件.它适应Windows、linux等多种操作系统,支持Apache、Nginx、IIs多种服务器软件。悟空CRM致力于为促进中小企业的发展做出更好更实用的软件,采用免费开源的方式,分享技术与经验。 悟空CRM 0.5.5 更新日志:2017-04-21 1.修复了几处安全隐患; 2.解决了任务.日程描述显示问题; 3.自定义字段添加时自动生成字段名

悟空CRM v 0.5.5 284 查看详情 悟空CRM v 0.5.5
  • {{ url_for('static', filename=user_image) }}:这是Flask中获取静态文件URL的推荐方式。url_for函数会根据您的应用配置生成正确的URL,例如/static/images/chart.png。
  • alt="动态图片":为图片提供替代文本,有助于可访问性。
  • get_flashed_messages:用于显示Flask后端发送的闪现消息(如图片不存在的提示)。

2. 使用 J*aScript 实现图片定时刷新

要实现图片的定时刷新,我们需要在前端(chart.html)使用J*aScript。关键在于定时更新动态图片标签的src属性。为了强制浏览器重新加载图片而不是使用缓存,我们通常会在URL后添加一个时间戳或随机查询参数。

2.1 修改 chart.html 添加 J*aScript

在chart.html中添加<script>标签:</script>

<!DOCTYPE html>
<html>
<head>
    <title>动态图片展示与刷新</title>
    <style>
        img { max-width: 100%; height: auto; display: block; margin-top: 20px; border: 1px solid #ddd; }
        .flash { color: green; font-weight: bold; }
        .error { color: red; font-weight: bold; }
        .flash-messages { list-style: none; padding: 0; }
    </style>
</head>
<body>
    <h1>图片动态展示与刷新</h1>

    {% with messages = get_flashed_messages(with_categories=true) %}
      {% if messages %}
        <ul class="flash-messages">
        {% for category, message in messages %}
          <li class="{{ category }}">{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}

    <h2>当前图片 (<span id="refresh-counter">每5秒刷新</span>)</h2>
    @@##@@

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const imgElement = document.getElementById('dynamic-image');
            const refreshCounter = document.getElementById('refresh-counter');
            let countdown = 5; // 刷新倒计时,与 setInterval 间隔一致

            function updateImage() {
                // 获取当前图片的原始URL(不带查询参数)
                const currentSrc = imgElement.src.split('?')[0];
                // 添加一个时间戳作为查询参数,强制浏览器刷新缓存
                imgElement.src = currentSrc + '?' + new Date().getTime();
                console.log('图片已刷新:', imgElement.src);
                countdown = 5; // 刷新后重置倒计时
                refreshCounter.textContent = `每${countdown}秒刷新`;
            }

            // 初始化倒计时显示
            refreshCounter.textContent = `每${countdown}秒刷新`;

            // 每秒更新倒计时,每5秒刷新图片
            setInterval(function() {
                countdown--;
                if (countdown <= 0) {
                    updateImage(); // 执行图片刷新
                } else {
                    refreshCounter.textContent = `每${countdown}秒刷新`;
                }
            }, 1000); // 每1000毫秒(1秒)执行一次
        });
    </script>
</body>
</html>

J*aScript 代码说明:

  • document.addEventListener('DOMContentLoaded', ...):确保DOM完全加载后再执行J*aScript。
  • imgElement = document.getElementById('dynamic-image'):获取图片元素。
  • updateImage() 函数:
    • imgElement.src.split('?')[0]:获取图片URL中不包含查询参数的部分。
    • imgElement.src = currentSrc + '?' + new Date().getTime():通过在URL末尾添加一个唯一的当前时间戳(?1678886400000 类似),欺骗浏览器认为这是一个新的URL,从而强制它重新请求图片,而不是从缓存中读取。
  • setInterval(function() { ... }, 1000):设置一个定时器,每1秒执行一次回调函数。我们用它来更新倒计时并触发图片刷新。
  • 倒计时逻辑:countdown变量用于显示距离下次刷新的秒数,当countdown归零时调用updateImage()并重置countdown。

3. 动态图片内容管理:以上传为例

为了让“图片本身变化但文件名不变”的需求有实际意义,我们需要一种机制来更新服务器上的图片文件。这里我们通过一个文件上传功能来实现。

3.1 修改 app.py 添加上传路由

在app.py中添加一个文件上传路由:

import os
from flask import Flask, render_template, url_for, flash, request, redirect
from werkzeug.utils import secure_filename

# 配置上传文件夹和允许的文件扩展名
UPLOAD_FOLDER = os.path.join('static', 'images')
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.secret_key = 'your_secret_key_here' # 生产环境请使用复杂且安全的密钥

# 辅助函数:检查文件扩展名是否允许
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route("/")
def index():
    return "<p>Flask应用正在运行!</p>"

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # 检查请求中是否有文件部分
        if 'file' not in request.files:
            flash('未选择文件', 'error')
            return redirect(request.url)
        file = request.files['file']
        # 如果用户没有选择文件,浏览器会提交一个空文件
        if file.filename == '':
            flash('未选择文件', 'error')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            # 将上传的文件保存为固定名称 'chart.png',会覆盖旧文件
            filename_to_s*e = 'chart.png' 
            file.s*e(os.path.join(app.config['UPLOAD_FOLDER'], filename_to_s*e))
            flash('图片上传成功并已更新!', 'success')
            return redirect(url_for('show_img')) # 上传成功后重定向回图片展示页
    # 如果是GET请求,或者上传失败,可以渲染一个上传表单页面
    # 但在此示例中,我们直接在 chart.html 中包含上传表单
    return redirect(url_for('show_img'))

@app.route("/chart")
def show_img():
Flask应用中实现动态图片展示与定时刷新动态图片

以上就是Flask应用中实现动态图片展示与定时刷新的详细内容,更多请关注其它相关文章!


# 不存在  # 网站优化技术价格报告  # 群梦整合营销推广  # 松溪营销推广招聘信息  # 佛山外贸网站推广招聘  # seo心法教学视频  # 全网营销推广公司靠谱  # 网站链接优化指标  # 沛县网站优化公司  # 湛江电商网站建设  # 新建区营销推广多少钱  # 目录下  # 表单  # 请使用  # 图片上传  # 文件扩展名  # javascript  # 回调  # 倒计时  # 上传  # 路由  # ai  # 后端  # 回调函数  # app  # 浏览器  # go  # 前端  # html  # java  # python 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  J*a实现学校排课程序_面向对象结构化项目示例  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  深入理解Go语言中的指针类型:以*string为例  DLsite中文平台入口 DLsite官网内容在线查看  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  React/Next.js中实现列表项的动态选择与移动  word中如何让数字纵向排列_Word数字纵向排列方法  AO3官方在线访问地址 Archive of Our Own最新镜像合集  淘宝支付提示失败如何解决 淘宝支付流程优化方法  顺丰快递查单号物流信息 顺丰快递小程序查询入口  12306选座系统怎么选连座_12306选座多人连坐操作方法  J*aScript中正确使用querySelectorAll与复杂CSS选择器  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  Tabulator表格日期时间排序问题及自定义解决方案  c++如何实现单例设计模式_c++线程安全的单例模式写法  大象笔记网页版入口 印象笔记网页版登录入口  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  PDF文件体积过大处理_PDF压缩技巧详解  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  Angular中父组件异步更新子组件复选框状态的实践指南  必由学网页版入口 必由学官方平台直接访问  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  Composer如何在生产环境安全地执行composer update  AO3最新可访问网址 Archive of Our Own官方在线入口  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  Typer应用中动态命令行参数的解析与处理  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  小红书网页版入口链接分享 小红书官网直接进  Lar*el递归关系中排除子孙节点的策略  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口 

搜索