使用Marshmallow SQLAlchemySchema时遇TypeError:__init__()接收到意外关键字参数'strict'的问题求助
使用Marshmallow SQLAlchemySchema时遇TypeError:init()接收到意外关键字参数'strict'的问题求助
嘿,我来帮你解决这个问题!先梳理下你的情况:你想用Marshmallow序列化SQLAlchemy模型返回JSON,但现在遇到了strict参数的错误,去掉这个参数又返回空对象{},咱们一步步来排查解决。
你的代码片段
from flask import Flask,jsonify from flask_sqlalchemy import SQLAlchemy from marshmallow_sqlalchemy import SQLAlchemySchema from marshmallow import Schema import os import jsonpickle app = Flask(__name__) db_name = 'student.db' basedir = os.path.abspath(os.path.dirname(__file__)) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, db_name) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy() db.init_app(app) from models.model import Tutor with app.app_context(): db.create_all() #Create tutor schema class TutorSchema(SQLAlchemySchema): class Meta: fields = ('tutor_id','tutor_forename','tutor_surname','tutor_email','tutor_category','module_id') # In it schema tutor_schema = TutorSchema(strict = True) tutors_schema = TutorSchema(many =True,strict = True) @app.route('/', methods = ['GET']) def tefetchLessonsByTutorst(): lessons = Tutor.query.all() results = tutors_schema.dump(lessons) return jsonify( results)
遇到的错误
TypeError: init() got an unexpected keyword argument 'strict'
问题原因与解决方案
1. 移除strict参数
Marshmallow 3.x版本已经移除了strict参数,这个参数是旧版本(2.x)用来控制验证错误抛出方式的,新版本默认就启用了严格模式,所以你不需要再手动传递这个参数啦。
2. 修复Schema的Meta配置(解决返回空对象的问题)
你现在的TutorSchema没有指定对应的SQLAlchemy模型!SQLAlchemySchema需要在Meta类里明确设置model属性,不然它不知道要序列化哪个模型的数据,自然返回空对象。
修改后的TutorSchema和实例化代码如下:
#Create tutor schema class TutorSchema(SQLAlchemySchema): class Meta: model = Tutor # 必须指定对应的模型类 fields = ('tutor_id','tutor_forename','tutor_surname','tutor_email','tutor_category','module_id') # 实例化Schema时移除strict参数 tutor_schema = TutorSchema() tutors_schema = TutorSchema(many=True)
3. 额外检查点
- 确保你的
Tutor模型里确实包含Meta中指定的所有字段(tutor_id、tutor_forename等) - 确认数据库里
Tutor表有数据,不然查询出来是空的,返回的也是空数组哦
这样修改后,再访问你的GET接口,应该就能正确返回Tutor数据的JSON响应啦!
备注:内容来源于stack exchange,提问作者Randi
相关产品推荐
相关产品推荐

