如何使用flask restplus验证POST负载中的日期类型?

时间:2019-05-02 18:47:03

标签: python post flask payload flask-restplus

请考虑以下内容:

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”不是通用的日期格式。

我研究了Datedoc, 我看到有一个formatparse方法,应检查字符串是否为通用日期格式。 但是,它们似乎在这里没有被称呼。

还有另一种方法吗? 目前,我正在手动验证日期格式,但似乎fask restplus应该可以为我做这件事。

3 个答案:

答案 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