Flask如何访问app文件夹外的资源并在HTML页面显示图片等文件?
Flask 访问 app 目录外资源的解决方案
有两种常用的实现方式,灵活度都比较高,可以根据你的业务需求选择:
方式一:自定义路由映射 data 目录(推荐)
通过 Flask 内置的 send_from_directory 方法编写专属路由,专门处理data目录下的资源请求,兼容现有url_for的使用习惯:
- 首先导入依赖并定义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')
- 编写资源服务路由,可按需添加访问限制:
# 可选:添加允许访问的文件后缀白名单,降低安全风险 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)
- 模板中调用方式和原有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
相关产品推荐
相关产品推荐

