Flask、Marshmallow 3 和 webargs use_args 无法解析参数
Flask, Marshmallow 3, and webargs use_args fails to parse arguments
对于 Flask 1.1.2、marshmallow 3.6.1 和 webargs 6.1.0,我的所有参数始终是 missing
.
架构:
class ExportSearchSchema(Schema):
limit = fields.Integer(required=False, allow_none=False, default=10, missing=10)
offset = fields.Integer(required=False, allow_none=False, default=0, missing=0)
status = fields.Str(required=False)
class Meta:
unknown = RAISE
@validates('status')
def validate_status(self, value):
if value and value not in ['complete', 'pending', 'failed']:
raise ValidationError('Invalid status: {}'.format(value))
@validates('limit')
def validate_limit(self, value):
if value > 100:
raise ValidationError('Max limit is 100')
if value < 1:
raise ValidationError('Limit must be a positive number and less than 100')
@validates('offset')
def validate_offset(self, value):
if value < 0:
raise ValidationError('Offset must be equal to, or greater than 0')
blueprint.py:
from flask import jsonify, Response
from flask import Blueprint
from marshmallow import Schema, fields, validates, ValidationError, RAISE
from webargs.flaskparser import use_args
exports = Blueprint('exports', __name__)
@exports.route('exports/',
methods=['GET'], strict_slashes=False)
@use_args(ExportSearchSchema(unknown=RAISE))
def get_export_list(qparams):
log.info("qparams {}".format(qparams)
response = jsonify({'data': 'export_list'})
response.mimetype = 'application/json'
return response
当我为 limit
或 offset
卷曲任何值时,它总是使用 default
值。
curl http://localhost:8000/exports?limit=5930
log: "qparams {'limit': 10, 'offset': 0}"}
我希望提高 ValidationError
,因为限制应该 > 100。
当我卷曲一个未知参数时,我希望引发一个 ValidationError
,因为它是一个未知参数。这也没有按预期工作。
curl http://localhost:8000/exports?lkfjdskl=fkjdsl
returns 一个 200 并且没有 qparams
.
我在组合 webargs
、Flask
和 marshmallow
时做错了什么?
webargs 6 中的逻辑发生了变化。
在 webargs 6 之前,解析器会遍历模式的字段,并且默认情况下会搜索多个位置以查找值。
在 webargs 6 中,解析器只是将数据从一个位置传递到模式。位置默认为 "json"
.
由于您使用的是查询参数,因此需要明确指定:
@use_args(ExportSearchSchema(unknown=RAISE), location="query")
由于您没有指定位置,json body 被假定,没有找到任何内容,并使用默认值。
这在 webargs 文档中有记录:"upgrading to 6.0"。
对于 Flask 1.1.2、marshmallow 3.6.1 和 webargs 6.1.0,我的所有参数始终是 missing
.
架构:
class ExportSearchSchema(Schema):
limit = fields.Integer(required=False, allow_none=False, default=10, missing=10)
offset = fields.Integer(required=False, allow_none=False, default=0, missing=0)
status = fields.Str(required=False)
class Meta:
unknown = RAISE
@validates('status')
def validate_status(self, value):
if value and value not in ['complete', 'pending', 'failed']:
raise ValidationError('Invalid status: {}'.format(value))
@validates('limit')
def validate_limit(self, value):
if value > 100:
raise ValidationError('Max limit is 100')
if value < 1:
raise ValidationError('Limit must be a positive number and less than 100')
@validates('offset')
def validate_offset(self, value):
if value < 0:
raise ValidationError('Offset must be equal to, or greater than 0')
blueprint.py:
from flask import jsonify, Response
from flask import Blueprint
from marshmallow import Schema, fields, validates, ValidationError, RAISE
from webargs.flaskparser import use_args
exports = Blueprint('exports', __name__)
@exports.route('exports/',
methods=['GET'], strict_slashes=False)
@use_args(ExportSearchSchema(unknown=RAISE))
def get_export_list(qparams):
log.info("qparams {}".format(qparams)
response = jsonify({'data': 'export_list'})
response.mimetype = 'application/json'
return response
当我为 limit
或 offset
卷曲任何值时,它总是使用 default
值。
curl http://localhost:8000/exports?limit=5930
log: "qparams {'limit': 10, 'offset': 0}"}
我希望提高 ValidationError
,因为限制应该 > 100。
当我卷曲一个未知参数时,我希望引发一个 ValidationError
,因为它是一个未知参数。这也没有按预期工作。
curl http://localhost:8000/exports?lkfjdskl=fkjdsl
returns 一个 200 并且没有 qparams
.
我在组合 webargs
、Flask
和 marshmallow
时做错了什么?
webargs 6 中的逻辑发生了变化。
在 webargs 6 之前,解析器会遍历模式的字段,并且默认情况下会搜索多个位置以查找值。
在 webargs 6 中,解析器只是将数据从一个位置传递到模式。位置默认为 "json"
.
由于您使用的是查询参数,因此需要明确指定:
@use_args(ExportSearchSchema(unknown=RAISE), location="query")
由于您没有指定位置,json body 被假定,没有找到任何内容,并使用默认值。
这在 webargs 文档中有记录:"upgrading to 6.0"。