请考虑以下内容:
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
类doc,
我看到有一个format
和parse
方法,应检查字符串是否为通用日期格式。
但是,它们似乎在这里没有被称呼。
还有另一种方法吗? 目前,我正在手动验证日期格式,但似乎fask restplus应该可以为我做这件事。
答案 0 :(得分:3)
要进行验证,您可以添加参数validate:
@ns.expect(payload, validate=True)
以下是文档的链接: https://flask-restplus.readthedocs.io/en/stable/swagger.html#the-api-expect-decorator
答案 1 :(得分:1)
使用expect
时似乎没有得到验证。您可以使用reqparse.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')
payload = api.model('Payload', {
'a_str': fields.String,
'a_date': fields.Date(required=True)
})
@ns.route('/')
class AResource(Resource):
@ns.expect(payload)
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('a_str', type=str)
parser.add_argument('a_date', type=inputs.datetime_from_iso8601)
try: # Will raise an error if date can't be parsed.
args = parser.parse_args() # type "dict"
return jsonify(args)
except:
return None, 400
if __name__ == '__main__':
app.run(debug=True)
答案 2 :(得分:0)
第 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