
本文介绍在 Flask Web 应用中,如何通过 URL 路径参数将文件名从 /archive 页面准确传递至 /delete 路由,避免使用不安全的表单字段传参,同时结合 Jinja2 模板动态渲染和路径安全校验,实现健壮的视频文件删除功能。
本文介绍在 flask web 应用中,如何通过 url 路径参数将文件名从 `/archive` 页面准确传递至 `/delete` 路由,避免使用不安全的表单字段传参,同时结合 jinja2 模板动态渲染和路径安全校验,实现健壮的视频文件删除功能。
在 Flask 开发中,直接在 HTML 字符串中拼接动态按钮(如 <input name="idx" value="Delete">)不仅难以绑定索引或文件名,还极易引发安全与逻辑问题:name=idx 实际会提交字符串 "idx" 而非变量值;且未对用户输入做校验,存在路径遍历风险(如 filename=../../etc/passwd)。正确做法是利用 Flask 的变量路由 + Jinja2 模板渲染 + 显式文件路径拼接,确保数据传递精准、可读性强且具备基本防护能力。
以下为推荐实现方案:
✅ 使用变量路由传递文件名(推荐)
将待删文件名作为 URL 路径参数传递,语义清晰、无需表单字段解析:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
@app.post('/delete/<filename>')
def delete(filename):
base_path = '/home/pi/Videos/'
full_path = os.path.join(base_path, filename)
# 【关键防护】验证文件确实在目标目录下,防止路径穿越
if not os.path.realpath(full_path).startswith(os.path.realpath(base_path)):
return "Invalid file path", 400
try:
os.remove(full_path)
except FileNotFoundError:
pass # 文件已不存在,静默处理
except PermissionError:
return "Permission denied", 403
return redirect(url_for('archive'))</filename>
✅ 使用 Jinja2 模板动态生成删除表单
替代硬编码 HTML 字符串,提升可维护性与安全性:
@app.route('/archive')
def archive():
path = '/home/pi/Videos/'
dir_list = sorted(os.listdir(path))
return render_template_string('''
<meta charset="UTF-8"><title>Video Archive</title><div class="box">
<div class="flex-box">
{% for file in dir_list %}
<div style="background: black; padding: 8px; margin: 4px 0;">
{{ file }}
<form method="post" action="%7B%7B%20url_for('delete',%20filename=file)%20%7D%7D" style="display:inline;">
<button type="submit" class="btn">Delete</button>
</form>
</div>
{% endfor %}
</div>
</div>
''', dir_list=dir_list)
⚠️ 注意事项与最佳实践
-
禁止直接信任
filename参数:必须通过os.path.realpath()校验其是否位于合法目录内,杜绝../路径穿越攻击; -
优先使用
@app.post()装饰器:明确限定/delete仅响应 POST 请求,符合 REST 语义; - 避免在模板中拼接敏感路径:所有路径组装应在 Python 层完成,Jinja2 仅负责展示;
-
补充错误处理:对
FileNotFoundError和PermissionError做区分响应,便于前端调试; -
生产环境建议迁移至
.html文件:将模板移至templates/archive.html,使用render_template('archive.html', dir_list=...)提升工程规范性。
该方案彻底规避了原始代码中因字符串拼接导致的变量失效问题,同时通过路径白名单校验和明确的 HTTP 方法约束,兼顾功能性与安全性,是 Flask 文件管理类应用的标准实践。










