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
相关产品推荐
相关产品推荐

