首页 > 解决方案 > marshmallow.exceptions.ValidationError: {'_schema': ['输入类型无效。']}

问题描述

这是一个使用 MySQL 数据库的 CRUD 烧瓶应用程序。当我尝试发送地图/风景的发布请求时会出现问题。该方法应该从 post 请求中检索数据、创建对象并写入数据库,但解析查询可能存在问题。提前感谢您的回复。

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from marshmallow import fields, post_load
import json
import copy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:root@localhost/lab6-db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
ma = Marshmallow(app)


class Scenery(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    amount = db.Column(db.Integer, unique=False)
    price = db.Column(db.Integer, unique=False)
    installation_time_in_days = db.Column(db.Integer, unique=False)
    film_type = db.Column(db.String(20), unique=False)

    def __init__(self, amount, price, installation_time_in_days, film_type):
        self.amount = amount
        self.price = price
        self.installation_time_in_days = installation_time_in_days
        self.film_type = film_type


class ScenerySchema(ma.Schema):
    amount = fields.Integer()
    price = fields.Integer()
    installation_time_in_days = fields.Integer()
    film_type = fields.Str()

    @post_load
    def make_scenery(self, data, **kwargs):
        return Scenery(**data)


scenery_example_schema = ScenerySchema()
scenery_examples_schema = ScenerySchema(many=True)


@app.route("/scenery", methods=["POST"])
def add_scenery():
    scenery = scenery_example_schema.load(request.json)
    db.session.add(scenery)
    db.session.commit()
    return scenery_example_schema.jsonify(request.json)


@app.route("/scenery", methods=["GET"])
def get_scenery():
    all_scenery = Scenery.query.all()
    result = scenery_examples_schema.dump(all_scenery)
    return jsonify(result)


@app.route("/scenery/<id>", methods=["GET"])
def scenery_detail(id):
    scenery = Scenery.query.get(id)
    if not scenery:
        abort(404)
    return scenery_example_schema.jsonify(scenery)


@app.route("/scenery/<id>", methods=["PUT"])
def update_scenery(id):
    scenery = Scenery.query.get(id)
    if not scenery:
        abort(404)
    old_scenery = copy.deepcopy(scenery)
    scenery.amount = request.json['amount']
    scenery.price = request.json['price']
    scenery.installation_time_in_days = request.json['installation_time_in_days']
    scenery.film_type = request.json['film_type']
    db.session.commit()
    return scenery_example_schema.jsonify(old_scenery)


@app.route("/scenery/<id>", methods=['DELETE'])
def delete_scenery(id):
    scenery = Scenery.query.get(id)
    if not scenery:
        abort(404)
    db.session.delete(scenery)
    db.session.commit()
    return scenery_example_schema.jsonify(scenery)


if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

serwer 启动,但是当我尝试 post 方法时它返回错误

Traceback (most recent call last):
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 2069, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 2054, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 2051, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 1501, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 1499, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\flask\app.py", line 1485, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\app.py", line 46, in add_scenery
    scenery = scenery_example_schema.load(request.json)
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\marshmallow\schema.py", line 714, in load
    return self._do_load(
  File "C:\Users\Xiaomi\PycharmProjects\lab6(3)\venv\Lib\site-packages\marshmallow\schema.py", line 896, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'_schema': ['Invalid input type.']}

标签: pythonmysqlflask

解决方案


推荐阅读