我在Flask中有以下端点
from flask import Flask
from marshmallow import EXCLUDE, Schema, fields
from webargs.flaskparser import use_kwargs
app = Flask(
__name__, static_url_path="", static_folder="static", template_folder="templates"
)
class Measure(Schema):
type = fields.Int(required=True)
value = fields.Float(required=True)
unit = fields.Int(required=True)
date = fields.Int(required=True)
class RequestSchema(Schema):
measures = fields.List(fields.Nested(Measure))
@app.route("/save", methods=["POST"])
@use_kwargs(
RequestSchema,
location="json_or_form",
unknown=EXCLUDE,
)
def save(**measures):
return {"foo": measures}, 200使用pytest,我测试以下内容:
import pytest
@pytest.fixture(scope="module")
def app():
test_app = AppClientPublic()
return test_app.app
def test_save(app):
measures = [
{
"type": 1,
"value": 2.2,
"unit": 3,
"date": 4,
},
{
"type": 5,
"value": 6.6,
"unit": 7,
"date": 8,
},
]
r = app.post(
"/save",
data={"measures": measures},
)
assert r.status_code == 200我得到以下错误:
错误422不可处理实体:请求格式良好,但由于语义错误无法遵循。-{‘消息’:{‘json_或_form’:{‘措施’:{0:{'_schema':‘无效输入类型’},1:{'_schema':‘无效输入类型.’},'schema':,'headers':None}
但是,如果我直接验证同一字典:
d = {
"measures": [
{
"type": 1,
"value": 2.2,
"unit": 3,
"date": 4,
},
{
"type": 5,
"value": 6.6,
"unit": 7,
"date": 8,
},
]
}
req_schema = RequestSchema()
errors = req_schema.validate(d)
print(errors) # {} -> no errors我没有发现验证错误。
我也绝对没有问题来验证简单的对象,比如深度-1字典,但是我无法验证Measure端点上的一个列表。
我做错了什么?
PS:
use_kwargs中使用时不起作用:发布于 2022-08-17 08:27:50
问题在pytest方面,而不是Flask方面。
我将post调用更改为使用json而不是data
r = app.post("/save", json={"measures": measures})
# instead of
r = app.post("/save", data={"measures": measures})https://stackoverflow.com/questions/73165483
复制相似问题