如何用Flask创建动态文件发送算法?解决多子目录路由冗余问题
只用单个Flask路由实现多子目录文件下载服务?
嘿,完全理解你的困扰——硬编码几十个路由不仅繁琐,后期维护起来也头疼!其实Flask早就为这种场景提供了便捷的解决方案,只用一个路由就能搞定所有子目录的文件下载需求。
问题回顾
你当前的文件结构是processedMain下包含多个子目录(processed1、processed2...processedN),每个子目录下有大量文件,之前需要为每个子目录单独编写@app.route和对应的视图函数,代码重复度极高。
极简解决方案
Flask的路径转换器(path:)可以捕获包含斜杠的完整路径,正好适配你的需求。只需要3行核心代码就能替代所有重复的路由:
from flask import send_file @app.route('/<path:id>') def returnImg(id): # 提取文件名,让用户下载时看到的是纯文件名而非完整路径 fileName = id.rsplit('/', 1)[-1] return send_file(id, as_attachment=True, attachment_filename=fileName)
关键解释
<path:id>路由规则:path:是Flask的内置转换器,它会把URL中从/之后的所有内容(包括子目录的斜杠)都捕获到id变量里,这样不管文件在哪个子目录下,都能通过这个路由匹配到。- 文件名处理:
id.rsplit('/', 1)[-1]是从完整路径中提取最后一个斜杠后的部分,也就是纯文件名,这样用户下载时看到的是xxx.jpg而不是processed1/xxx.jpg,体验更友好。
重要安全提示(新手必看)
为了避免恶意用户通过构造路径访问服务器上的敏感文件(比如../../etc/passwd),建议在视图函数中添加路径校验,限制只能访问processedMain目录下的文件:
import os from flask import send_file, abort @app.route('/<path:id>') def returnImg(id): # 定义允许访问的根目录 allowed_base_dir = os.path.abspath('processedMain') # 把用户传递的路径转为绝对路径 target_file_path = os.path.abspath(id) # 检查目标路径是否在允许的根目录范围内 if not target_file_path.startswith(allowed_base_dir): abort(403) # 返回403禁止访问 fileName = id.rsplit('/', 1)[-1] return send_file(target_file_path, as_attachment=True, attachment_filename=fileName)
这样就能在实现功能的同时,保障服务器的文件安全啦!
内容的提问来源于stack exchange,提问作者Igor Kolesnikov
相关产品推荐
相关产品推荐

