Flask上传文件报'ImmutableMultiDict对象不可调用'错误如何解决
问题报错原因与修复方案
1 直接报错解决
你遇到的TypeError: 'ImmutableMultiDict' object is not callable错误,是因为Flask的request.files是存储上传文件的字典对象,不是可调用的方法,你代码里错误添加了括号调用,把request.files()改成request.files即可解决该报错。
2 其他必填修复项
仅修改上述代码还无法完成文件上传解析需求,还有几处必须调整的逻辑:
2.1 HTML表单修改
上传文件的表单必须添加enctype="multipart/form-data"属性,否则后端无法接收上传的文件内容,修改后的form标签如下:
<form action="import_form" method="post" class="reveal-content" enctype="multipart/form-data">
2.2 后端逻辑修改
- 获取上传的文件需要通过表单文件控件的
name属性filename取值,即request.files.get('filename') - pandas可直接读取上传的文件流,无需存到本地再读取,同时要区分csv和xlsx的读取逻辑
- 最终将读取到的表格内容转成HTML格式返回给前端展示
修正后的完整可运行Python代码示例:
import pandas as pd from flask import Flask, request app = Flask(__name__) @app.route('/import_form', methods=['POST', 'GET']) def import_form(): if request.method == "POST": # 获取上传的文件对象 file_obj = request.files.get('filename') if not file_obj: return '未上传有效文件' # 按文件后缀区分读取逻辑 filename = file_obj.filename if filename.endswith('.csv'): df = pd.read_csv(file_obj) elif filename.endswith(('.xlsx', '.xls')): df = pd.read_excel(file_obj) else: return '不支持的文件格式,仅支持csv、xlsx、xls格式' # 将表格数据转成HTML格式直接返回展示 return df.to_html() # GET请求返回上传表单页面,可替换为你自己的模板渲染逻辑 return ''' <form action="import_form" method="post" class="reveal-content" enctype="multipart/form-data"> <div class="row"> <div class="col-md-7"> <div class="form-group"> <input name="filename" type="file" accept=".csv, .xlsx" class="form-control" id="filename" placeholder="filename" required > </div> </div> <button type="submit" class="btn btn-default btn-lg">Send</button> </div> </form> ''' if __name__ == '__main__': # 树莓派运行可设置host为0.0.0.0,方便同局域网设备访问 app.run(host='0.0.0.0', port=5000, debug=True)
2.3 冗余代码说明
你之前编写的read_csv函数存在两处问题:一是硬编码了错误的文件名'file.xlxs'(正确后缀为xlsx),二是没有用到传入的参数,实际需求中不需要保留该函数,直接在路由逻辑里处理即可。
内容的提问来源于stack exchange,提问作者Steve0-90
相关产品推荐
相关产品推荐

