0

0

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

聖光之護

聖光之護

发布时间:2025-12-13 19:29:36

|

255人浏览过

|

来源于php中文网

原创

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

本教程详细介绍了如何在flask web应用中展示静态图片,并通过javascript实现图片的定时刷新,解决浏览器缓存问题。同时,文章还涵盖了如何在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 "

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 函数来正确引用静态文件。




    
    
    动态图片展示


    

图片展示与刷新


@@##@@

说明:

  • 动态图片 使用 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秒刷新一次图片。

iWebShop开源商城系统
iWebShop开源商城系统

iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切

下载



    
    
    动态图片展示


    

图片展示与刷新


@@##@@

说明:

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

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 中添加一个文件上传表单。




    
    
    动态图片展示
    


    

图片展示与刷新

{% with messages = get_flashed_messages() %} {% if messages %}
    {% for message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %} {% endwith %}

@@##@@

说明:

  • 定义了上传表单。enctype="multipart/form-data" 是文件上传的必需属性。
  • 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实现图片的定时刷新,并支持用户上传新的图片来动态更新显示内容。

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

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

556

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

732

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

414

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

552

2023.09.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号