You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask如何访问app文件夹外的资源并在HTML页面显示图片等文件?

Flask 访问 app 目录外资源的解决方案

有两种常用的实现方式,灵活度都比较高,可以根据你的业务需求选择:

方式一:自定义路由映射 data 目录(推荐)

通过 Flask 内置的 send_from_directory 方法编写专属路由,专门处理data目录下的资源请求,兼容现有url_for的使用习惯:

  1. 首先导入依赖并定义data目录的绝对路径:
from flask import Flask, send_from_directory
import os

app = Flask(__name__)
# 定位项目根目录下的data文件夹,可根据启动文件的实际存放位置调整路径
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
# 若启动文件存放在app目录内,改为 os.path.join(os.path.dirname(APP_ROOT), 'data')
DATA_FOLDER = os.path.join(APP_ROOT, 'data')
  1. 编写资源服务路由,可按需添加访问限制:
# 可选:添加允许访问的文件后缀白名单,降低安全风险
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'pdf', 'doc', 'docx'}

@app.route('/data/<path:filename>')
def serve_data_files(filename):
    # 校验文件后缀
    ext = filename.rsplit('.', 1)[1].lower() if '.' in filename else ''
    if ext not in ALLOWED_EXTENSIONS:
        return '不允许访问该类型文件', 403
    return send_from_directory(DATA_FOLDER, filename)
  1. 模板中调用方式和原有static资源一致:
<!-- 访问data/images/logo.jpg -->
<img src="{{ url_for('serve_data_files', filename='images/logo.jpg') }}" alt="logo">

方式二:添加额外静态目录规则

如果不需要自定义访问控制,也可以直接给Flask应用添加额外的静态目录映射:

# 初始化时保留原有static目录
app = Flask(__name__, static_folder='app/base/static')
# 映射data目录为静态资源目录,访问前缀为/data
app.add_url_rule('/data/<path:filename>', endpoint='data_static',
                 view_func=lambda filename: send_from_directory(DATA_FOLDER, filename))

模板中调用方法为url_for('data_static', filename='files/xxx.pdf')

注意事项

  • 生产环境建议使用Nginx等反向代理服务器直接映射data目录提供静态资源服务,性能和安全性都远高于Flask自带的服务
  • send_from_directory本身已经内置了路径遍历攻击的防护逻辑,无需额外处理路径跳转问题,加上后缀白名单后安全度更高

内容的提问来源于stack exchange,提问作者nduong99vn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:54:01