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

Flask路由返回404错误:文件链接无法正确匹配路由

问题解决思路

核心问题

你的下载路由无法匹配请求URL,因为Flask默认的路由变量(如<folder>)不支持包含斜杠。当请求/E0009N/ant/Lecture%201.pdf时,路由/<folder>/<filename>会仅把E0009N匹配给<folder>,剩下的ant/Lecture%201.pdf无法匹配<filename>(同样默认不允许斜杠),导致路由完全不触发,所以print("test")不会执行,直接返回404。

修复步骤

1. 修改下载路由,支持带斜杠的路径参数

使用Flask的path转换器,让<folder>可以匹配包含斜杠的路径(比如E0009N/ant):

@app.route('/<path:folder>/<filename>', methods=['GET'])
@login_required
def download(folder, filename):
    print("test")
    return send_from_directory(
        path.join(app.config['UPLOAD_FOLDER'], folder), 
        filename, 
        as_attachment=True
    )
  • 备注:下载请求仅需GET方法,无需配置POST。

2. 验证基础配置

  • 确认app.config['UPLOAD_FOLDER']正确指向uploads目录,示例:
    app.config['UPLOAD_FOLDER'] = 'uploads'  # 推荐使用绝对路径避免路径问题
    
  • 确保Flask运行进程对目标文件有读取权限。

额外优化建议

简化folder路由的路径拼接逻辑,减少重复代码:

@app.route('/<folder>/')
@login_required
def folder(folder):
    subdirs = ['ant', 'books', 'tentor']
    file_lists = {}
    base_path = path.join(app.config['UPLOAD_FOLDER'], folder)
    
    for subdir in subdirs:
        dir_path = path.join(base_path, subdir)
        if path.exists(dir_path):
            files = [f for f in listdir(dir_path) if path.isfile(path.join(dir_path, f))]
            files.sort()
            file_lists[subdir] = files
    
    return render_template(
        'folder.html', 
        anteckningar=file_lists.get('ant', []),
        books=file_lists.get('books', []),
        tentor=file_lists.get('tentor', []),
        folder=folder
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:53:25