Flask带尾斜杠路由重定向后上传文件丢失,如何解决?
Flask带尾斜杠路由重定向后丢失上传文件问题
问题场景
Flask路由设置为/uploads/,按照官方文档的重定向规则,访问不带尾斜杠的localhost:5000/uploads会自动重定向到带尾斜杠的版本。但实际测试中:
- 直接访问
localhost:5000/uploads/上传文件,视图函数能正常获取并打印文件列表 - 访问
localhost:5000/uploads上传文件,重定向后files变量为空
原代码示例:
@app.route('/uploads/') def upload_file(): files = request.files.getlist('files') print(files)
解决方案
问题核心是:Flask默认的重定向会将POST请求转为GET请求,导致上传的文件数据丢失。以下是两种可行方案,优先推荐第一种:
方案1:关闭路由的严格尾斜杠检查
给路由添加strict_slashes=False参数,让路由同时匹配带/不带尾斜杠的请求,避免触发重定向,从而保留POST的文件数据:
@app.route('/uploads/', strict_slashes=False) def upload_file(): files = request.files.getlist('files') print(files)
这样用户访问/uploads或/uploads/都会直接进入视图函数,不会发生重定向,文件数据可以正常获取。
方案2:手动处理POST重定向(不推荐)
如果必须强制用户最终访问带尾斜杠的URL,需要手动暂存文件数据后再重定向:
- 给不带尾斜杠的路由单独编写POST处理逻辑,将文件暂存到临时目录或session(注意session存储大小限制)
- 重定向到带尾斜杠的路由后,再从暂存位置读取文件
这种方式复杂度高,且存在数据丢失或性能问题,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

