flask restful: как передать функцию python в качестве параметра для запуска запроса GET? - PullRequest
0 голосов
/ 22 апреля 2020

в flask -restplus, я хочу передать объект системного вызова: subprocess.call() в GET запрос на вывод информации о сеансе R на конечной точке сервера. Для этого, я думаю, мне нужно добавить объект системного вызова в анализатор, который, я надеюсь, на конечной точке api выведет информацию R-сеанса. Однако, когда я нажал на код, я не увидел печатной информации о сеансе на конечной точке сервера. Как правильно передать запрос system.call() на GET, чтобы что-то напечатать в конечной точке? Любая идея?

моя попытка :

вот системный вызов, который может распечатать сеанс R на python консоли IDE.

sess = subprocess.call(['C:/Program Files/R/R-3.6.3/bin/Rscript','--vanilla','-e','sessionInfo()'])

моя попытка передать sess в запрос GET :

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

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

sess = subprocess.call(['C:/Program Files/R/R-3.6.3/bin/Rscript','--vanilla','-e','sessionInfo()'])

@ns.route('/')
class AResource(Resource):
    def get(self):
        parser = reqparse.RequestParse()
        parser.add_argument(sess, type= str, required=True)
        #return parser.parse_args()
        try:
            args = parser.parse_args()
            return jsonify(args)
        except:
            return None, 400

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

, когда я запустил код, я не вижу распечатанной информации о сеансе на конечной точке сервера. Я думаю, что что-то не так, когда я передаю sess объект в запрос GET. Как я могу передать пользовательскую функцию или объект python в качестве параметра в запрос GET, чтобы распечатать что-либо на конечной точке сервера? Любая идея?

Я новичок ie в flask -restplus, поэтому, возможно, я не должен передавать sess GET-запрос, как указано выше. Я смиренно прошу о возможной помощи. Спасибо

1 Ответ

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

Для ясности, без flask вы должны получить хотя бы один выход.

Например, при запуске фиктивного скрипта:

from flask import Flask
from flask_restplus import Api
import subprocess

app = Flask(__name__)
api = Api(app)

sess = subprocess.call(["echo","I am getting this output!"])

выдаст

I am getting this output!

Как вызывать subprocess.call в каждом запросе get

  1. Просто переместите subprocess.call в запрос get.
  2. Будьте осторожны, чтобы не создавать конечную точку API на «/», так как flask_restplus использует ее по умолчанию в качестве справочной страницы API, поэтому это может привести к путанице. поэтому обязательно используйте конечную точку, например '/ hello'

Пример кода

from flask import Flask
from flask_restplus import Resource, Api
from flask_restplus import Api
import subprocess
import os

app = Flask(__name__)
api = Api(app)

@api.route('/hello')
class HelloWorld(Resource):
    def get(self):
        subprocess.call(["echo","I am getting this output!"])
        subprocess.call(['Rscript','--vanilla','-e','sessionInfo()'])
        return {'hello123': 'world'}

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

Когда я запускаю приложение на терминале и запрашиваю http://localhost: 5000 / Привет в моем браузере Я вижу этот вывод на моем терминале

I am getting this output!
R version 3.6.3 (2020-02-29)
Platform: x86_64-apple-darwin18.7.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS/LAPACK: /usr/local/Cellar/openblas/0.3.9/lib/libopenblasp-r0.3.9.dylib

locale:
[1] en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] compiler_3.6.3
127.0.0.1 - - [22/Apr/2020 15:01:16] "GET /hello HTTP/1.1" 200 -
...