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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:18:03