如何解决Flask 使用 Marshmallow 将 SQLAlchemy 序列化为 JSON 错误
我有一个非常简单的 Flask RESTful API,我根据 Packt 一书“Python API 开发基础”构建了它。我可以成功地从数据库中获取数据,但我无法发布数据。
我正在使用 Flask、SQLAlchemy 和 flask_restful,以及一个 Microsoft Server Management Studio 本地数据库。尝试将条目插入用户表时,我目前在 user.py 资源中收到错误(“名称'user_schema' 未定义。”)。一个用户只是一个 ID、姓名、年龄。
我以前从未使用过 Marshmallow,我不确定自己做错了什么。
我正在尝试通过使用 httpie 将其输入到控制台来创建一个新用户:
http POST localhost:5000/users Name="Kyle" Age="22"
错误
[2021-03-31 10:44:40,944] ERROR in app: Exception on /users [POST]
Traceback (most recent call last):
File "c:\users\e096752\documents\cole's projects\flask projects\testproj\venv\lib\site-packages\flask\app.py",line 1950,in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\e096752\documents\cole's projects\flask projects\testproj\venv\lib\site-packages\flask\app.py",line 1936,in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "c:\users\e096752\documents\cole's projects\flask projects\testproj\venv\lib\site-packages\flask_restful\__init__.py",line 468,in wrapper
resp = resource(*args,**kwargs)
File "c:\users\e096752\documents\cole's projects\flask projects\testproj\venv\lib\site-packages\flask\views.py",line 89,in view
return self.dispatch_request(*args,**kwargs)
File "c:\users\e096752\documents\cole's projects\flask projects\testproj\venv\lib\site-packages\flask_restful\__init__.py",line 583,in dispatch_request
resp = meth(*args,**kwargs)
File "C:\Users\e096752\Documents\Cole's Projects\Flask Projects\testProj\resources\users.py",line 34,in post
data,errors = user_schema.load(data=json_data)
NameError: name 'user_schema' is not defined
127.0.0.1 - - [31/Mar/2021 10:44:40] "POST /users HTTP/1.1" 500 -
users.py 资源
from flask import request
from flask_restful import Resource
from http import HTTPStatus
from flask import jsonify
from sqlToJson import convert_sqlaLchamy_to_json
from models.Users import User,userList
from schemas.user import UserSchema
class User_List_Resource(Resource):
user_schema = UserSchema()
def get(self):
users = User.query.all()
data = jsonify(convert_sqlaLchamy_to_json(users))
return data
def post(self):
#Non-marshmallow approach gives error: "Object of type User is not JSON serializable"
# json_data = request.get_json()
# user = User(Name=json_data['Name'],# Age=json_data['Age'])
# return jsonify(user),HTTPStatus.CREATED
#Marshmallow approach gives error: "line 36,name 'user_schema' is not defined."
json_data = request.get_json()
data,errors = user_schema.load(data=json_data)
if errors:
return {'message': 'Name already exists'},HTTPStatus.BAD_REQUEST
user = User(**data)
user.save()
return user_schema.dump(user).data,HTTPStatus.CREATED
Users.py 模型
from extensions import db
from flask_marshmallow import Marshmallow
userList = []
def get_last_id():
if userList:
lastUser = userList[-1]
else:
return 1
return lastUser.id + 1
class User(db.Model):
__tablename__ = 'Users'
ID = db.Column(db.Integer,primary_key=True)
Name = db.Column(db.String(50))
Age = db.Column(db.Integer)
Users.py 架构
from marshmallow import Schema,fields
class UserSchema(Schema):
class Meta:
ordered = True
Name = fields.String(required=True)
Age = fields.Integer(required=True)
app.py
>from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from flask_restful import Resource,Api
from flask import jsonify
import json
from sqlToJson import convert_sqlaLchamy_to_json
import datetime
from flask_restful import Api
from config import Config
from extensions import db
from models.Case_Log import Case_Log
from resources.case_log import Case_Log_List_Resource
from models.Users import User
from resources.users import User_List_Resource
from resources.home import Home_Resource
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
register_extensions(app)
register_resources(app)
return app
def register_extensions(app):
db.init_app(app)
def register_resources(app):
api = Api(app)
#Add all resources as routes
api.add_resource(Home_Resource,'/')
api.add_resource(Case_Log_List_Resource,'/case_logs')
api.add_resource(User_List_Resource,'/users')
if __name__ == '__main__':
app = create_app()
app.run()
如果有帮助,这是我的项目结构:
如果有帮助,这里是数据库表的图片:
解决方法
我先推荐
模式,不是从用户模型加载,所以你必须在 UserSchema 中将其声明为模型
from marshmallow import Schema,fields
from models.users import User
class UserSchema(Schema):
class Meta:
model = User
ordered = True
Name = fields.String(required=True)
Age = fields.Integer(required=True)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。