_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'},
}
所以你可以一次检查整个输入。
我一直在试图找出导致此输入类型错误的原因,但似乎无法弄清楚。
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'},
}
所以你可以一次检查整个输入。