Как проверить тип даты в полезной нагрузке POST с помощью колбы restplus? - PullRequest
1 голос
/ 02 мая 2019

Рассмотрим следующее:

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

Если я POST {"a_str": 0, "a_date": "2000-01-01"} я получаю 400, как и ожидалось, потому что a_str не является строкой. Однако, когда я POST {"a_str": "str", "a_date": "asd"}, я не получаю 400. Здесь я также хотел бы получить 400, потому что «asd» не является распространенным форматом даты.

Я заглянул в Date класс документ и Я вижу, что существует метод format и parse, который должен проверять, имеет ли строка общий формат даты. Тем не менее, они, кажется, не называются здесь.

Есть ли другой способ, как это сделать? В настоящее время я проверяю формат даты вручную, но похоже, что fask restplus сможет сделать это за меня.

1 Ответ

1 голос
/ 10 мая 2019

Кажется, он не проверяется при использовании 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...