любой обходной путь, чтобы заставить flask -стабильный API потреблять POST-запрос JSON данные в python? - PullRequest
1 голос
/ 28 апреля 2020

используя flask -restplus, я создал минимальный flask API, который должен принимать тело запроса POST JSON, а также анализировать и передавать параметр для вызова функции API и возврата вывода в конечную точку сервера. Я создал api.model схему для ввода JSON данных. Я хочу, чтобы мой минимальный API-интерфейс правильно понимал и анализировал тело POST requst JSON и передавал параметр в функцию API. Для этого я попытался request, reqparse, но это не работает.

input JSON body

{
  "body": {
    "gender": "M",
    "feat_a": {
      "value": 11,
      "device": "roch"
    },
    "feat_b": {
      "value": 32,
      "device": "cobas"
    },
    "feat_c": {
      "value": 45,
      "device": "roch"
    }
  }
}

всякий раз, когда POST-запрос JSON body правильно анализируется и передается моей пользовательской функции, моя пользовательская функция ожидает такой же POST-запрос тело. Вот как my_func ожидает ввода json_data в качестве параметра:

library(jsonlite)

my_func <- function(json_data){
  query=fromJSON(json_data)
  data=query$body
  ## do something 
}

минимальный flask API :

from flask_restplus import fields
from flask import Flask, jsonify
from flask_restplus import Api, Namespace, Resource, fields, reqparse, inputs

import rpy2
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
##
app = Flask(__name__)
api = Api(app, version='1.0')
ns = Namespace('test')  

features_attr = api.model('features', {
    'value': fields.Integer(required=True),
    'device': fields.String(required=True)
})

feat_root_objs = api.model('main', {
    'gender': fields.String(required=True),
    'features': fields.List(fields.Nested(features_attr, required=True))
    })

@ns.route('/hello')
class helloWorld(Resource):
    @ns.expect(feat_root_objs, validate=False)
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('gender', type=str)
        parser.add_argument('features', type=str, required=True)

        args = parser.parse_args()
        myfuncs = robjects.r.source("my_func.R")
        res = myfuncs(args)
        return jsonify({'which features are used': res})

if __name__ == '__main__':
    api.add_namespace(ns)
    app.run(debug=True)

, но я не могу понять Как передать данные запроса POST JSON в функцию API. В приведенной выше попытке у меня есть следующее сообщение об ошибке в теле ответа:

{
  "errors": {
    "features": "Missing required parameter in the JSON body or the post body or the query string"
  },
  "message": "Input payload validation failed"
}

Есть идеи, чтобы заставить эту работу? Как заставить функцию API потреблять данные запроса POST JSON? есть идеи?

...