В flask -restplus API мне нужно выполнить проверку данных запроса JSON, где я уже определил схему тела запроса с помощью api.model
. В основном я хочу передать входные данные JSON в функцию API, где мне нужно проверить входные данные JSON перед использованием функции API. Для этого я использовал RequestParser
для выполнения этой задачи, но функция API ожидала правильных JSON данных в качестве параметров после проверки и анализа запроса JSON. Чтобы выполнить запрос JSON проверки, сначала мне нужно проанализировать полученные входные данные JSON, проанализировать его JSON тело, проверить каждое, затем реконструировать его как объект JSON и перейти к функции API. Есть ли более простой способ сделать это?
ввод JSON данные
{
"body": {
"gender": "M",
"PCT": {
"value": 12,
"device": "roche_cobas"
},
"IL6": {
"value": 12,
"device": "roche_cobas"
},
"CRP": {
"value": 12,
"device": "roche_cobas"
}
}
}
моя текущая попытка в flask
from flask_restplus import Api, Namespace, Resource, fields, reqparse, inputs
from flask import Flask, request, make_response, Response, jsonify
app = Flask(__name__)
api = Api(app)
ns = Namespace('')
feature = api.model('feature', {
'value': fields.Integer(required=True),
'time': fields.Date(required=True)
})
features = api.model('featureList', {
'age': fields.String,
'gender': fields.String(required=True),
'time': fields.Date,
'features': fields.List(fields.Nested(feature, required=True))
})
@ns.route('/hello')
class helloResource(Resource):
@ns.expect(features)
def post(self):
json_dict = request.json ## get input JSON data
## need to parse json_dict to validate expected argument in JSON body
root_parser = reqparse.RequestParser()
root_parser.add_argument('body', type=dict)
root_args = root_parser.parse_args()
jsbody_parser = reqparse.RequestParser()
jsbody_parser.add_argument('age', type=dict, location = ('body',))
jsbody_parser.add_argument('gender', type=dict, location=('body',))
## IL6, CRP could be something else, how to use **kwargs here
jsbody_parser.add_argument('IL6', type=dict, location=('body',))
jsbody_parser.add_argument('PCT', type=dict, location=('body',))
jsbody_parser.add_argument('CRP', type=dict, location=('body',))
jsbody_parser = jsbody_parser.parse_args(req=root_args)
## after validate each argument on input JSON request body, all needs to be constructed as JSON data
json_data = json.dumps(jsonify(jsbody_parser)) ## how can I get JSON again from jsbody_parser
func_output = my_funcs(json_data)
rest = make_response(jsonify(str(func_output)), 200)
return rest
if __name__ == '__main__':
api.add_namespace(ns)
app.run(debug=True)
обновление: фиктивная функция API
Вот фиктивная функция, которая ожидает json данных после проверки:
import json
def my_funcs(json_data):
a =json.loads(json_data)
for k,v in a.iteritems():
print k,v
return jsonify(a)
текущий вывод вышеуказанной попытки :
У меня есть это в теле ответа:
{
"errors": {
"gender": "'gender' is a required property"
},
"message": "Input payload validation failed"
}
очевидно, запрос JSON ввод не обрабатывается и не проверяется в моей попытке. Я думаю, мне нужно передать json_dict
объекту RequestParser, но все еще не могу проверить здесь запрос JSON. как это сделать?
Мне нужно проверить ожидаемые аргументы из JSON тела, после проверки я хочу построить JSON тело, которое будет использоваться в качестве параметра для функции API. Как я могу это сделать? какой обходной путь для этого?
проанализировано JSON должно пройти к my_funcs
в моем сообщении, данные запроса JSON должны быть проанализированы, например age
, gender
должны быть проверены как ожидаемые аргументы в запросе JSON, затем jsonify добавленные аргументы как JSON и передают my_funcs
. как сделать это легко в fl
Я хочу убедиться, что flask должен анализировать тело JSON и добавлять аргументы, как ожидалось, иначе возникнет ошибка. например:
{
"body": {
"car": "M",
"PCT": {
"value": 12,
"device": "roche_cobas"
},
"IL6": {
"device": "roche_cobas"
},
"CRP": {
"value": 12
}
}
}
, если я предоставлю JSON данные, как указано выше, для выполнения запроса POST к конечной точке сервера, он должен выдать ошибку. Как этого добиться? как проверить запрос POST JSON для flask вызова API?