_schema 上的 Marsmhallow ValidationError - 输入类型无效

Marsmhallow ValidationError on _schema - Invalid Input Type

我一直在试图找出导致此输入类型错误的原因,但似乎无法弄清楚。

models/pin.py

from sqlalchemy import Column, String


class Pin(db.Model):
    __tablename__ = 'pin'

    pin = Column(String, primary_key=True)

schemas/pin.py

from ..models.pin import Pin
from marshmallow import fields, validate


class PinSchema(ma.Schema):
    pin = fields.Str(required=True, validate=[validate.Length(5)])

    class Meta:
        model = Pin
        fields = ('pin')

pin_schema = PinSchema()

resources/pin.py

from flask_restful import Resource
from flask import request
from ..schemas.pin import pin_schema


class PinResource(Resource):

    """
        Update current pin
        Expecting:
        {
            'pin': 'current_pin'
            'new_pin': 'new_pin'
        }
    """
    def patch(self):
        
        data = request.get_json()
        
        errors = pin_schema.validate(data['new_pin'])

        if errors:
            return { "message": errors }, 400

        return { 'tmp': 'tmp' }, 200

请求我通过 Postman 发送

{
    "pin": "12345"
    "new_pin": "123456"
}

服务器响应

{
    "message": {
        "_schema": [
            "Invalid input type."
        ]
    }
}

我尝试用 type(new_pin) 检查 new_pin 的类型,而只是 returns <class 'str'>

我错过了什么吗? new_pin 不应该通过验证,除非它不能转换为字符串或短于 5 个字符吗?

我查看了 ,因为这是我发现的唯一与我相似但似乎与我的情况不符的一个。

PinSchema 期望像

这样的输入
{'pin': '2465735452347'}

当你经过它时

'2465735452347'

您可以通过将输入嵌入字典来调整输入以匹配预期的结构。

更好的是,您可以定义一个资源输入架构,期望

{
    'pin': {'pin': '2465735452347'},
    'new_pin': {'pin': '2465735452347'},
}

所以你可以一次检查整个输入。