Как передать параметр из метода POST и сделать вызов функции в flask? - PullRequest
1 голос
/ 24 апреля 2020

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

минимальное flask приложение

вот минимальное приложение flask, которое я написал:

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', {
    'num': fields.Integer(required=True)
})


@ns.route('/')
class AResource(Resource):
    @ns.expect(payload)
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('num', type=str, required=True)
        try:  # Will raise an error if date can't be parsed.
            args = parser.parse_args()
            param = args['num]  ## todo: how to pass params to my custom function
            ## output from custom function, where function would consum param
            return jsonify(output)
        except:
            return None, 400

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

Пользовательская функция

Вот пользовательская функция, которую POST-метод собирается вызывать и запускать функцию и возвращать ее вывод в конечную точку сервера:

primest <- function(num){
  p <- 2:num
  i <- 1
  while (p[i] <= sqrt(num)) {
    p <-  p[p %% p[i] != 0 | p==p[i]]
    i <- i+1
  }
  p
}

update

всякий раз, когда используется метод api post, метод post передает параметр пользовательской функции, затем пользовательская функция выполняет вычисление и возвращает свой вывод в виде объекта json конечной точке сервера. как разработать этот процесс проще? Любая мысль?

и я могу вызвать функцию R из python, используя это:

@ns.route('/')
class Rsession(Resource):
    def get(self):
        output = subprocess.call(['Rscript','--vanilla','-e','primest.R'])
        return {'call function': output}

Я застрял, как я буду передавать и анализировать аргумент для вызова моей пользовательской функции. Как это сделать в flask или flask -restplus? любая возможная мысль? Как я могу вызвать функцию, которая вызывается по запросу POST? есть идеи?

1 Ответ

1 голос
/ 24 апреля 2020

Насколько я правильно понял ваш вопрос, вы просто все усложнили. вместо использования arg_parse, давайте сделаем так:

from flask import Flask, jsonify, request
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)
ns = api.namespace('ns')

payload = api.model('Payload', {
    'num': fields.Integer(required=True)
})

@api.route('/')
class AResource(Resource):
    @ns.expect(payload)
    def post(self):
        param = request.json['num']
        try: 
            res = primes_method1(param)
            return jsonify(res)
        except:
            return None, 400

def primes_method1(n):
    out = list()
    for num in range(1, n+1):
        prime = True
        for i in range(2, num):
            if (num % i == 0):
                prime = False
        if prime:
            out.append(num)
    return out


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

это решение полностью работает для меня, надеюсь, это разрешит ваши сомнения. Если вы хотите вызвать функцию R из python, subprocess.call() выполнит эту работу. надеюсь, что это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...