Flask获取文件列表接口报错:TypeError: get()缺少必填参数ident
Flask文件列表接口报错:TypeError: get() missing 1 required positional argument: 'ident'
错误根源
你的报错核心是**Upload模型未定义json()方法**——SQLAlchemy的Model类默认不提供该方法,当你在getFiles中调用x.json()时,会触发内部方法调用错误,最终抛出get()参数缺失的异常。另外还有两处细节问题需要修正:
修复步骤
1. 给Upload模型添加序列化方法
在Upload类中新增json()方法,返回可序列化的模型数据字典(注意不要包含二进制的data字段,无法直接转为JSON):
class Upload(db.Model): id=db.Column(db.Integer, primary_key=True) filename = db.Column(db.String(50)) data = db.Column(db.LargeBinary) def json(self): return { 'id': self.id, 'filename': self.filename }
2. 修正配置项拼写错误
将SQLALCHEMY_TRACK_MODIFICATIONs改为正确的SQLALCHEMY_TRACK_MODIFICATIONS(末尾字母大写S),否则会触发SQLAlchemy警告:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
3. 修复路由中ID类型不匹配问题
download和delete路由的upload_id是字符串类型,而数据库id为整数,需转换后再查询,避免匹配失败:
@app.route('/download/<upload_id>') def download(upload_id): upload = Upload.query.filter_by(id=int(upload_id)).first() if not upload: return {'message': 'File not found'}, 404 return send_file(BytesIO(upload.data), attachment_filename=upload.filename , as_attachment=True) @app.route('/delete/<upload_id>') def delete(upload_id): f = Upload.query.filter_by(id=int(upload_id)).first() if f: db.session.delete(f) db.session.commit() return {'message':'Deleted'} else: return {'message':'File not found'},404
修改后的完整app.py代码
from io import BytesIO from flask import Flask , render_template, request , send_file from flask_sqlalchemy import SQLAlchemy from flask_restful import Api, Resource, reqparse from flask_cors import CORS, cross_origin app= Flask(__name__) CORS(app) app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///data.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Upload(db.Model): id=db.Column(db.Integer, primary_key=True) filename = db.Column(db.String(50)) data = db.Column(db.LargeBinary) def json(self): return { 'id': self.id, 'filename': self.filename } @app.route('/' , methods=['GET', 'POST']) def index(): if request.method == 'POST': file= request.files['file'] upload = Upload(filename=file.filename, data=file.read()) db.session.add(upload) db.session.commit() return f'Uploaded: {file.filename}' return render_template('index.html') @app.route('/files', methods=['GET']) def getFiles(): files = Upload.query.all() return {'Files': [x.json() for x in files]} @app.route('/download/<upload_id>') def download(upload_id): upload = Upload.query.filter_by(id=int(upload_id)).first() if not upload: return {'message': 'File not found'}, 404 return send_file(BytesIO(upload.data), attachment_filename=upload.filename , as_attachment=True) @app.route('/delete/<upload_id>') def delete(upload_id): f = Upload.query.filter_by(id=int(upload_id)).first() if f: db.session.delete(f) db.session.commit() return {'message':'Deleted'} else: return {'message':'File not found'},404 # 首次运行时创建数据库表 with app.app_context(): db.create_all()
额外说明
- 不要在
json()方法中返回data字段,二进制文件内容无法直接序列化为JSON,前端需通过/download/<id>接口下载文件。 - 首次运行代码时,
with app.app_context(): db.create_all()会自动创建SQLite数据库表,避免表不存在的报错。
内容的提问来源于stack exchange,提问作者user16001720
相关产品推荐
相关产品推荐

