ValidationError в схеме Flask-Marshmallow

Я создаю простой веб-API с flask и sqlalchemy с marshmallow в качестве сериализатора, и вот UserModel.

class UserModel(db.Model):
    __tablename__ = 'users'

    id            = db.Column(db.Integer, primary_key = True)
    username      = db.Column(db.String(120), unique = True, nullable = False)
    password      = db.Column(db.String(120), nullable = False)
    user_role     = db.Column(db.String(10), nullable = False)
    access_token  = db.Column(db.String(120), unique = True, nullable = True, default='as' )
    refresh_token = db.Column(db.String(120), unique = True, nullable = True, default='as' )

и схема,

class UserSchema(Schema):
    username = fields.Str()
    password = fields.Str()
    user_role = fields.Str()
    access_token = fields.Str()
    refresh_token = fields.Str()

когда я пытался создать запись пользователя, используя почтовый запрос с почтальоном, как это

{
    "username":"test1",
    "password":"test1pswd",
    "user_role":"admin"
}

он возвращает следующую ошибку на консоли,

marshmallow.exceptions.ValidationError: {'_schema': ['Invalid input type.']}

Что я здесь делаю неправильно?


person pl-jay    schedule 16.09.2019    source источник


Ответы (1)


Вы пытаетесь загрузить json, используя метод Schema.load.

>>> import json
>>> import marshmallow as mm
>>> class S(mm.Schema):               
...     username = mm.fields.Str()
...     password = mm.fields.Str()
...     user_role = mm.fields.Str()
...     access_token = mm.fields.Str()
...     refresh_token = mm.fields.Str()
... 
>>> d = {'username': 'test1', 'password': 'test1pswd', 'user_role': 'admin'}

>>> S().load(json.dumps(d))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/kdwyer/.virtualenvs/so37/lib/python3.7/site-packages/marshmallow/schema.py", line 681, in load
    data, many=many, partial=partial, unknown=unknown, postprocess=True
  File "/home/kdwyer/.virtualenvs/so37/lib/python3.7/site-packages/marshmallow/schema.py", line 840, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'_schema': ['Invalid input type.']}

Вы можете:

Вызовите json.loads() для данных, прежде чем перейти к Schema.load

>>> S().load(json.loads(json.dumps(d)))
{'password': 'test1pswd', 'user_role': 'admin', 'username': 'test1'}

Передайте json в Schema.loads для автоматической десериализации

>>> S().loads(json.dumps(d))
{'password': 'test1pswd', 'user_role': 'admin', 'username': 'test1'}
person snakecharmerb    schedule 16.09.2019
comment
Я потратил около 1 часа, чтобы выяснить, что не так с моим кодом, пока я не пришел сюда. Я отправлял данные json. Я просто удалил формат json и отправил обычные данные, и это сработало. - person GKV; 14.04.2020
comment
Для меня я получал List, должен был установить SomeSchema(many=True) - person Asif Ali; 03.06.2020