考虑以下内容:
from flask import Flask
from flask_restplus import Api, Resource, fields
app = Flask(__name__)
api = Api(app)
ns = api.namespace('ns')
payload = api.model('Payload', {
'a_str': fields.String(required=True),
'a_date': fields.Date(required=True)
})
@ns.route('/')
class AResource(Resource):
@ns.expect(payload)
def post(self):
pass
如果我发布了{"a_str": 0, "a_date": "2000-01-01"}
,我会按预期获得400因为a_str
不是字符串。但是,当我发布{"a_str": "str", "a_date": "asd"}
时,我不会得到400。在这里,我也想获得400,因为" ASD"不是常见的日期格式。
我查看了Date
类文档和我看到有一个format
和parse
方法,该方法应检查字符串是否以通用日期格式检查。但是,它们似乎没有被称为这里。
还有另一种方法吗?目前,我正在手动验证日期格式,但是似乎FASK RESTPLUS应该能够为我做。
@andilabs提到,两次定义预期有效载荷确实很奇怪。您可以仅使用RequestParser
来定义预期有效载荷:
from flask import Flask, jsonify
from flask_restplus import Api, Resource, fields, reqparse, inputs
app = Flask(__name__)
api = Api(app)
ns = api.namespace('ns')
parser = reqparse.RequestParser()
parser.add_argument('a_str', type=str)
parser.add_argument('a_date', type=inputs.datetime_from_iso8601, required=True)
@ns.route('/')
class AResource(Resource):
@ns.expect(parser)
def get(self):
try: # Will raise an error if date can't be parsed.
args = parser.parse_args() # type `dict`
return jsonify(args)
except: # `a_date` wasn't provided or it failed to parse arguments.
return {}, 400
if __name__ == '__main__':
app.run(debug=True)
使用curl
测试:
$ curl -XGET -H "Content-type: application/json" -d '{"a_str": "Name", "a_date": "2012-01-01"}' 'http://127.0.0.1:5000/ns/'
{
"a_date": "Sun, 01 Jan 2012 00:00:00 GMT",
"a_str": "Name"
}
要验证您可以添加参数validate:
@ns.expect(payload, validate=True)
这是文档的链接:https://flask-restplus.readthedocs.io/en/stable/swagger.html#the-api-expect-decorator
步骤1: pip install isodate
步骤2:pip install strict-rfc3339
步骤3:
from jsonschema import FormatChecker
api = Api(your_app,format_checker=FormatChecker(formats=("date-time",)))
步骤4:
@api.expect(your_fields, validate=True)
参考:开放问题:https://github.com/noirbizarre/flask-restplus/issues/204